Что вы должны проверить в текстовых полях формы HTML? - PullRequest
0 голосов
/ 01 апреля 2009

Я пишу скрипт PHP, чтобы получить данные текстового поля из отправленной формы. Это простые текстовые поля, и я не хочу принимать теги HTML. Я думаю, что я должен по крайней мере использовать strip_tags () и addlashes (). Что-нибудь еще? Я не против ограничить ввод буквенно-цифровыми символами. Следует ли использовать регулярное выражение для поиска нестандартных символов?

Это простая форма, которая на самом деле (тьфу) отправляется по электронной почте человеку, обрабатывающему ее. (К сожалению, нет базы данных.) И это просто данные, имена и фамилии.

Edit: Я также хотел бы знать конкретно, что я должен искать. Каков консенсус в отношении разумной входной фильтрации?

Ответы [ 3 ]

6 голосов
/ 01 апреля 2009

Использование функций фильтра PHP .

Вы можете использовать их для очистки ввода и проверки ввода (например, адреса электронной почты).

Существует два подхода к проверке (это также относится к безопасности и многим другим вещам).

Во-первых, вы можете по умолчанию разрешить что-либо, кроме того, что явно запрещено. Или вы можете по умолчанию запретить все, кроме того, что разрешено.

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

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

  • SQL-инъекция: всегда использовать mysql_real_escape_string () на любом входе;
  • XSS (межсайтовый скриптинг): вообще говоря, вы должны удалить HTML-теги из пользовательского ввода. Вам, конечно, иногда придется разрешать их (например, блоки текстового редактора), но даже в этих случаях у вас будет список разрешенных тегов, и вы должны удалить все остальные (особенно теги); и
  • Как правило, вы должны удалить младшие символы (ниже ASCII 20 или около того); и
  • В зависимости от ваших требований к интернационализации вы можете удалить старшие символы (выше ASCII 127).

Хорошее значение по умолчанию:

$var = filter_var($var, FILTER_SANITIZE_STRING);

но выберите правильный фильтр для ситуации.

1 голос
/ 01 апреля 2009

Я не хочу принимать теги HTML. Я думаю, что я должен по крайней мере использовать strip_tags ()

Возможно, но не в том случае, если вы хотите, чтобы люди могли вводить символы / <’/‘> ’, которые означают« меньше и больше »и не имеют ничего общего с тегами.

При вводе для полей с произвольным текстом вам не захочется отфильтровывать намного больше, чем контрольные символы без перевода строки (которые вы обычно нигде не хотите), и, если вы используете UTF-8, недопустимо / избыточные последовательности.

Затем, когда вы выводите значение обратно на страницу, вы, конечно же, не забываете использовать htmlspecialchars (), чтобы ‘<’ экранировалось до ‘& lt;’ и отображалось на экране как литерал ‘<’, верно? Вам необходимо использовать htmlspecialchars () каждый раз, когда вы выводите текстовое значение в HTML в шаблоне, независимо от того, получена ли эта строка из формы, базы данных или где-то еще. </p>

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

и addlashes ().

addlashes () - почти всегда неправильная вещь. Хорошее эмпирическое правило: не используйте это.

addlashes () не подходит для экранирования SQL, поскольку он не соответствует фактическому формату экранирования строки SQL, поэтому вы можете создавать строки, которые по-прежнему опасны при использовании аддешлаша. Когда вы используете MySQL, вы должны использовать вместо этого mysql_real_escape_string (). Другие базы данных имеют свои собственные функции экранирования. Используйте их (или, проще, используйте параметризованные запросы, чтобы вам вообще не приходилось экранировать текст в SQL).

(addlashes () не подходит для выхода из HTML, потому что он вообще не пытается ничего делать со специальными символами HTML. Это не то, для чего он.)

В любом случае, попытка справиться с выходом-выходом на этапе фильтрации входов является обратной. Вместо этого сохраните все строки, которые являются внутренними для вашего приложения, в виде простого текста и избегайте их при выходе из приложения: mysql_real_escape_string, когда они собираются принять участие в запросе SQL, htmlspecialchars (), когда они собираются на страницу HTML и т. д.

1 голос
/ 01 апреля 2009

Это очень распространенный вопрос с множеством не очень четких ответов. Такие функции, как addlashes (), могут на самом деле принести больше вреда, чем пользы в некоторых установках. Некоторые основные правила, которым нужно следовать при работе с пользовательским вводом, это не доверять ничему, и если он не соответствует ожидаемому формату, не пытайтесь исправить это, просто вызовите ошибку.

Если вам требуется только буквенно-цифровое значение, то простое регулярное выражение справится с этим, но поможет немного больше информации.

Что вы собираетесь делать с данными? Как вы в настоящее время (или планируете) обрабатывать ввод, например, пользователь отправляет форму, обрабатывает ее и сохраняет данные в БД для последующего отображения (например, механизм комментариев).

Редактировать: если это так просто, как отправка текстового поля по электронной почте для обработки человеком. Мои самые большие проблемы были бы внедрением заголовка XSS и smtp (в зависимости от того, как электронная почта отправляется). Попробуйте использовать самое простое решение: если вам просто нужно получить буквенно-цифровые данные, используйте регулярное выражение и принимайте только это. Другое решение - использовать htmlentities с ENT_QUOTES.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...