Экранирование оболочки / базы данных с символами utf-8 - PullRequest
0 голосов
/ 22 сентября 2011

Каков предпочтительный порядок экранирования символов?

Например, в 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 в одном, потому что я не могу придумать другой способ, как вылечить весь этот беспорядок.

1 Ответ

1 голос
/ 22 сентября 2011

Ни.

Используйте или escapeshellcmd() или mysqli_real_escape_string(), в зависимости от того, что вы планируете делать с $string.

Никогда не используйте оба одновременно. Это не имеет смысла.

...