Как санировать пользовательский ввод в PHP? - PullRequest
1 голос
/ 06 января 2010

Этого достаточно?

$listing = mysql_real_escape_string(htmlspecialchars($_POST['listing']));

Ответы [ 8 ]

3 голосов
/ 06 января 2010

Зависит - если вы ожидаете текст, это нормально, хотя вы не должны вводить htmlspecialchars во ввод. Сделай это на выходе.

Возможно, вы захотите прочитать это: Какой самый лучший метод для очистки ввода пользователя с помощью PHP?

3 голосов
/ 06 января 2010

Вы можете использовать функцию PHP: filter_var()

хороший учебник по ссылке:

http://www.phpro.org/tutorials/Filtering-Data-with-PHP.html

пример для очистки целых чисел:

Очистить целое число просто с помощью фильтра FILTER_SANITIZE_INT. Этот фильтр удаляет все символы, кроме цифр и. + - Он прост в использовании, и нам больше не нужно удивлять себя регулярными выражениями.

<?php

/*** an integer ***/
$int = "abc40def+;2";

/*** sanitize the integer ***/
echo filter_var($int, FILTER_SANITIZE_NUMBER_INT);

?>

Приведенный выше код выдает 40 + 2, поскольку значения INT отсутствуют, как указано в фильтре, были удалены

1 голос
/ 06 января 2010

См:

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

0 голосов
/ 06 января 2010

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

Я бы предположил, что почти невозможно сделать SQL-инъекцию, если ввод определенно является числом или определенно адресом электронной почты, поэтому существует дополнительный уровень безопасности.

0 голосов
/ 06 января 2010

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

0 голосов
/ 06 января 2010

Это зависит от того, чего вы хотите достичь. Ваша версия предотвращает (возможно) все SQL-инъекции и удаляет HTML (точнее: предотвращает его интерпретацию при отправке в браузер). Вы можете (и, вероятно, должны) применить htmlspecialchars() к выводу, а не к вводу. Возможно, когда-нибудь в будущем вы захотите разрешить такие простые вещи, как <b>.

Но есть еще что-то для дезинфекции, например, если вы ожидаете адрес электронной почты, вы можете убедиться, что это действительно адрес электронной почты.

0 голосов
/ 06 января 2010

Что если ваша переменная листинга является массивом?

Вы должны рекурсивно очистить эту переменную.

Edit:

На самом деле, с помощью этой техники вы можете избежать SQL-инъекций, но не можете избежать XSS.

Чтобы очистить «ненадежную» строку, я обычно комбинирую strip_tags и html_entity_decode. Таким образом, я избегаю внедрения кода, даже если символы кодируются &#321;.

$cleaned_string = strip_tags( html_entity_decode( $var, ENT_QUOTES, 'UTF-8' ) );

Затем вы должны построить рекурсивную функцию, которая вызывает предыдущие функции и проходит по многомерным массивам.

В конце концов, когда вы хотите использовать переменную в операторе SQL, вы можете использовать функцию экранирования, специфичную для СУБД (или PDO).

$var_used_with_mysql = mysql_real_escape_string( $cleaned_string );
0 голосов
/ 06 января 2010

Да. Однако вы не должны использовать htmlspecialchars для ввода. Только на выходе, когда вы печатаете его.

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

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