2016-03-27 3 views
1

Вообще, я бы раздеться все символы, которые не английский, используя что-то вроде:Как я могу дезинфицировать строку, сохраняя при этом все неанглийскую поддержку алфавита

$file = filter_var($file, FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW | FILTER_FLAG_STRIP_HIGH); 

однако, я устал, не оказывает поддержку пользователей ввод с других языков, которые могут быть в виде загруженного файла (имя файла может быть на кириллице или на китайском, или на арабском языке и т. д.), или в поле формы, или даже на контент из WYSIWYG.

Примеров для санитарной обработки данных по отношению к этому, приходит в одной из двух форм

  • Те, что полоса всех символов, которые не английский
  • Те, которые преобразуют все символы, которые не являются английским языком для Английское письмо заменяет.

Проблема с этой практикой заключается в том, что у вас сломанная структура, которая притворяется, что поддерживает несколько языков, однако она действительно не исключает возможности отображения на их языке ярлыков или контента.

Существует множество атак, которые используют поддержку unicode/utf-8/utf-16/etc, передающую нулевые байты и т. Д., Поэтому ясно, что не дезинформирование данных не является вариантом.

Есть ли способ очистить переменную от произвольных команд, сохраняя при этом полные алфавиты/символы этих других языков, но в общих чертах вычеркивая все возможные непечатаемые символы, символы с нулями в них как часть символа, и других подобных эксплойтов, сохраняя при этом целостность фактических символов, введенных пользователем? Вышеприведенная команда идеальна и делает все как угодно, но было бы здорово, если бы был способ расширить ее, чтобы поддерживать поддержку всех языков.

ответ

1

Нулевые байты не являются (!) UTF-8, поэтому, если вы используете UTF-8 внутренне, все, что вам нужно сделать, это проверить, что переданные переменные являются UTF-8. Нет необходимости поддерживать UTF-16, например, потому что вы, как автор соответствующего API или формы, определяете правильную кодировку, и можете ограничить себя UTF-8. Кроме того, «unicode» также не является кодировкой, которую нужно поддерживать, просто потому, что это не кодировка. Скорее, Unicode является стандартом, и кодировки UTF являются его частью.

Теперь, назад к PHP, функция, которую вы ищете, это mb_check_encoding(). Обработка ошибок проста, если какой-либо параметр не проходит этот тест, вы отвечаете с ответом «плохой запрос». Не нужно пытаться угадать, что может потребоваться пользователю.

Хотя вопрос конкретно не спросить это, вот некоторые примеры и как они должны быть обработаны на входе:

  • не-UTF-8 байт: Отклонить 400 («плохой запросу»).
  • строки, содержащие элементы пути (например, ../): Принять.
  • имя файла (не путь к файлу), содержащий элементы пути (как ../): Отклонить с 400.
  • имен файлов شعار.jpg, 标志.png или логотип.png: Принять.
  • filename foo <0> bar.jpg: Принять.
  • номер abc: Отклонить с 400.
  • номер 1234: Принять.

Вот как обрабатывать их для различных выходов:

  • не-UTF-8 байт: Не может случиться, что они были отвергнуты ранее.
  • имя файла, содержащего элементы пути: не может быть, раньше они были отклонены.
  • filenames شعار.jpg, 标志.png или логотип.png в HTML: используйте дословно, если HTML-кодировка UTF-8, замените в качестве объектов HTML при использовании стандартного ISO8859-1.
  • filenames شعار.jpg, 标志.png или логотип.png в Bash: Используйте дословно, если кодировка файловой системы UTF-8.
  • filenames شعار.jpg, 标志.png или логотип.png в SQL: возможно, просто укажите, зависит от драйвера, DB, таблиц и т. Д. Обратитесь к руководству.
  • filename foo <0> bar.jpg в формате HTML: Escape as "foo bar.jpeg". Возможно использовать « » для пробелов.
  • filename foo <0> bar.jpg в Bash: Цитата или побег «», «<» и «>» с обратными косыми чертами.
  • filename foo <0> bar.jpg в SQL: просто укажите.
  • номер abc: Не может быть, они были отклонены раньше.
  • номер 1234 в формате HTML: используйте дословно.
  • номер 1234 в Bash: используйте дословно (не уверен).
  • номер 1234 в SQL: используйте дословно.

Общая процедура должна быть:

  • Определите ваши внутренние типы (строка, имя файла, номер) и все, что не соответствует отклонять. Эти типы создают ограничения (имя файла не включает элементы пути) и предлагают гарантии (имя файла может быть добавлено в каталог, чтобы сформировать имя файла внутри этого каталога).
  • Используйте библиотеку шаблонов (Усы приходят на ум) для HTML.
  • Используйте библиотеку обертки DB (PDO, Propel, Doctrine) для SQL.
  • Исключить параметры оболочки. Я не уверен, куда идти сюда, но я уверен, что вы найдете правильные пути.

Escaping - это не определенная процедура, а семейство процедур. Используемый алгоритм экранирования зависит от целевого контекста. Помимо того, что вы написали («побег также испортит имена»), фактическое противоположное должно быть так! В принципе, он гарантирует, что строка, содержащая меньше знака в XML, остается строкой, содержащей знак меньше, чем знак и не превращается в некорректный фрагмент XML. Чтобы достичь этого, избегая конвертирования строк, чтобы предотвратить любой символ, который обычно не интерпретируется как обычный текст, получая его обычную интерпретацию, такую ​​как символ пробела в оболочке.

+0

Я использовал null в качестве примера. Просто проверка UTF-8 или нет не очищает входные данные (чтобы сохранить его) «плохие» символы или строки. Плохо, я имею в виду вред.Если вы посмотрите, что делает пример 'filter_var', вы поймете, что я ищу. Он делает больше, чем полоса 1 символ. Он удаляет html и т. Д., А также создает плохие символы. –

+0

Моим личным подходом было бы исправить мое программное обеспечение, чтобы избежать ошибок, прежде чем интегрировать их в HTML или SQL-запросы. Еще лучше, создайте программное обеспечение на основе, которая делает почти невозможным испортить эти вещи. Теперь, учитывая ваш ответ, я бы сказал, что ваш вопрос нуждается в более подробных разъяснениях. Во-первых, какие байтовые последовательности вы хотите отклонить, какие должны проходить без изменений и какие из них следует скорректировать? Какие из этих требований не выполняются 'filter_var()' с соответствующими флагами? –

+0

рассмотрите имена файлов> شعار. Jpg или 标志 .png или логотип.png. Конечно, просто «побег» почти забавен, чтобы думать, что побег также испортит имена. Теперь расширьте это для реальных путей, которые содержат эти языки (ака, «альбом 1» или то, что пользователь решает на любом языке). У меня создается впечатление, что на самом деле это не способ сделать это, помимо ручного хеширования всего «алфавита» этих языков, который сделает такие вещи, как китайский, очень сложно пройти, не допуская нечетных символов, которые могут быть использованы для использования сервера , –

 Смежные вопросы

  • Нет связанных вопросов^_^