2009-08-11 5 views
3

Предположим, что я разрешаю своим пользователям отправлять форму, содержащую некоторые текстовые поля (я не говорю о паролях). Мои пользователи иногда используют символы, отличные от ASCII, такие как русский, китайский и т. Д., Поэтому я использую кодировки UTF-8 в моей базе данных. Вопрос в том, должен ли я действительно разрешать все возможные символы UTF-8? Я взглянул на таблицу ASCII и увидел, что символы от 0 до 31 не имеют никакого отношения к тексту, за исключением строк новой строки и пробелов. Персонажи от 176 до 223 кажутся для декоративных целей: стр. Должен ли я их ограничивать?Разрешенные символы в формах отправки (включая UTF-8)

ответ

4

Убедитесь, что это действительно UTF-8 и Unicode? Да

Удостоверьтесь, что в него не включены определенные символы, такие как коды управления? Вероятно, нет необходимости

Вы должны знать, что даже если вы используете UTF-8 в вашей форме, вы не можете получить правильный UTF-8 из всех пользовательских агентов, когда они посылают данные формы к вам, и вы будете необходимо отфильтровать его по мере необходимости. Invalid UTF-8 может принимать различные формы, некоторые из них

  • сверхдолгим кодировок (что может привести к проблемам безопасности)
  • Другие недопустимые символы UTF-8 последовательности байтов, которые могут свидетельствовать о том, что агент пользователя игнорируется кодирование символов и вместо этого отправил что-то вроде Windows-1252 или ISO-8859-1.
  • Кодовые точки, которые лежат в зарезервированной суррогатной пространстве в Unicode

Все вышеуказанную необходимость быть отфильтрованы во время ввода, в противном случае вы не хранить действительный Unicode.

Если вы хотите, чтобы служить правильный HTML или XHTML, которые используют подмножество Unicode, вам потребуется также нужно отфильтровать (или на входе или выходе): коды

  • C0 управления 0x00 к 0x19 (помимо вкладки, пространства, новой линии, провозная возврат)
  • 0x7F
  • C1 коды управления 0x80 до 0xBF
  • (возможно) любая точка выше код 0x10FFFF
+0

Все верно, и регулярное выражение, размещенное Gumbo, будет обрабатывать все эти проблемы. –

+0

Благодарим вас за ответ. Думаю, я буду использовать регулярное выражение, которое Гумбо предложил проверить на вход. Кажется, он обрабатывает все, что вы сказали, чтобы отфильтровать. – liviucmg

+0

Да, это регулярное выражение подходит для кодированного текста UTF-8, который будет использоваться в XHTML или HTML, поскольку он также отфильтровывает эти управляющие коды, как указано выше. – thomasrutter

6

В W3C пропускает эти символы в их примере регулярное выражение в Multilingual form encoding:

$field =~ 
    m/\A(
    [\x09\x0A\x0D\x20-\x7E]   # ASCII 
    | [\xC2-\xDF][\x80-\xBF]    # non-overlong 2-byte 
    | \xE0[\xA0-\xBF][\x80-\xBF]  # excluding overlongs 
    | [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2} # straight 3-byte 
    | \xED[\x80-\x9F][\x80-\xBF]  # excluding surrogates 
    | \xF0[\x90-\xBF][\x80-\xBF]{2}  # planes 1-3 
    | [\xF1-\xF3][\x80-\xBF]{3}   # planes 4-15 
    | \xF4[\x80-\x8F][\x80-\xBF]{2}  # plane 16 
)*\z/x; 
+0

PHP-эквивалент будет preg_match ('/ \ A ( [\ x09 \ x0A \ x0D \ x20- \ x7E] | [\ xC2- \ XDF] [\ x80- \ XBF] | \ xE0 [\ xA0- \ xBF] [\ x80- \ xBF] | [\ xE1- \ xEC \ xEE \ xEF] [\ x80- \ xBF] {2} | \ xED [\ x80- \ x9F] [\ x80- \ xBF] | \ xF0 [\ x90- \ xBF] [\ x80- \ xBF] {2} | [\ xF1- \ xF3] [\ x80- \ xBF] {3} | \ xF4 [ \ x80- \ x8F] [\ x80- \ xBF] {2} ) * \ z/x ', $ string); Правильно ли я? – liviucmg

+1

@bilygates: Вы также можете оставить свои комментарии. PHP 'preg_match' использует Perl-совместимые регулярные выражения, а модификатор' x' позволяет использовать пробелы и комментарии (начиная с '#' до конца строки), чтобы сделать регулярное выражение более понятным. – Gumbo

+0

@Gumbo Хорошо, сделаю. Большое спасибо! – liviucmg

1

No.

Это очень плохая идея, чтобы попытаться «предварительно чистой» ввод данных пользователем. То, что вы считаете «декоративным», может быть абсолютно необходимо читателям другого языка. Лучшее решение - хранить текст как есть в базе данных, а затем дезинфицировать его перед записью на страницу.

+0

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

+0

Если у вас есть чрезмерный или недооцененный вход, тогда невозможно восстановить исходные данные. Если немолированные данные сохраняются, их можно всегда очищать в зависимости от того, какой из них нужен. –

+0

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

1

Когда вы говорите «таблицу ASCII», вы говорите о this page, не так ли? Эта страница - мусор. Только первые 128 символов (т. Е. 0,127) являются «ASCII»; сопоставления, которые они показывают для чисел 128..255, - это расширение ASCII, называемое cp437. Существует множество «расширенных ASCII», а cp437 - далеко не самый общий.

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

Похоже, вам нужно больше узнать о кодировке символов и Unicode. Start here.

+0

Да, это именно та страница, на которую я смотрел. Я не знал, что символы 127 - 255 могут быть разными. Я посмотрю на эту статью, которую вы рекомендовали. Благодаря! – liviucmg