Каков предпочтительный порядок экранирования символов?
Например, в PHP
среде:
1) shell -> database = return escapeshellcmd(mysqli_real_escape_string($string));
?
2) база данных -> оболочка = return mysqli_real_escape_string(escapeshellcmd($string));
?
3) Нет разницы вообще?
Обновление
Просто чтобы уточнить, сайт, который я сейчас пытаюсь исправить, содержит много старых устаревших функций, использует magic_quotes и, по сути, не может использоваться после переноса со старого хоста на текущий, где возникли проблемы.
Первой проблемой было выход из MySQL, который я исправил с помощью mysql_real_escape_string();
, но проблема со средой CLI/Socket
MySQL сохраняется. То есть, когда у вас есть значение внутри textarea
, которое относится к команде UNIX, которому предшествует /
- символ прямой косой черты, и вы публикуете его - Apache приводит к методу 501 Не реализовано.
Так что да, мне нужно бежать mysql
и бежать от shell
команд. Но выход команды shell
(с примером № 1 из исходного вопроса) привел к торможению символа UTF-8 и потере большого количества необходимых символов HTML.
Содержимое, которое необходимо экранировать, взято из редактора WYSIWYG (SPAW), поэтому в нем содержится много цитат и время от времени команда UNIX, напоминающая валюту наших стран - Латвии. "/ ls", где LS - валюта.
Сайт обновляется самим клиентом, а не специалистом, и он должен оставаться таким - я имею в виду, мы не можем взять на себя редактирование контента. Кроме того, хотя мы могли бы сказать им, чтобы они не использовали /ls
, проблема UNIX сохраняется, если, например, они случайно попадают в /mkdir
, что может напоминать идентификатор чего-либо.
Они - активная туристическая компания, поэтому это нужно исправить как можно скорее. Так как мы обогнали их сайт, они знают, что система сломана, но у них нет свободных денег, чтобы тратить их на новый сайт / исправление текущего. Мы пришли к выводу, что исправить это будет сложнее, а значит дороже, чем переходить на нашу CMS, но деньги все равно остаются деньгами.
Итак, как мне избежать команд оболочки и базы данных из текстовой области этого редактора WYSIWYG, которая представляет собой одну строку, но при сохранении кодировки UTF-8 букв латышского алфавита - ā, š, č, ž
и т. Д. *
Может быть, мне не нужно избегать обоих, вот почему я спрашиваю.
Заранее спасибо!
Обновление
По запросу Shrapnels - пример строки (скопированной из представления HTML в SPAW), который заставит Apache ответить 501:
<div>
<span style="color: rgb(0, 0, 128); " class="Apple-style-span">
<span style="font-size: 12px; " class="Apple-style-span">
/ls
</span>
</span>
</div>
SPAW автоматически добавляет все эти немые элементы, и да, если /<command>
находится внутри строки, 501 !
И это все, что нужно для остановки, просто пространство имен, относящееся к функции командной строки UNIX. Как в этом случае /ls
, но может быть /rmdir
, /mkdir
и т. Д. У вас может быть 20000 символов без /ls
, и это будет работать. Когда-то есть что-то вроде этого - бац, мертвый!
Первоначально существовала функция, предназначенная для очистки всех ошибок (по крайней мере, я так полагаю, ее первоначальное имя было - removeShit();
):
$string = $_POST['wysiwyg_textarea']; // SPAW text area
function removeStuff($string){
return str_replace('/wysiwyg/empty.html', '', $txt);
}
Файл /wysiwyg/empty.html
равен 0 байтам - полностью пустой файл.
Но это не излечивает экранирование mysql и / или распознавание команд оболочки UNIX. Поэтому мне нужно исправить, чтобы избежать команд UNIX и любых вредных для MySQL вещей.
Итак, я пытался сделать это с:
return escapeshellcmd(mysqli_real_escape_string($string));
Но этот набор всех символов utf-8, плюс все символы новой строки были преобразованы в простую строку "rn" из, я думаю, \r\n
.
И теперь я ищу функцию, позволяющую избежать использования команд MySQL и Shell в одном, потому что я не могу придумать другой способ, как вылечить весь этот беспорядок.