Подходит ли эта пара функций для дезинфекции?


Это было взято из Учебника О'Рейли по PHP, MySQL и Javascript:

function sanitizeString($var)
{
    $var = stripslashes($var);
    $var = htmlentities($var);
    $var = strip_tags($var);
    return $var;
}

function sanitizeMySQL($var)
{
    $var = sanitizeString($var);
    $var = mysql_real_escape_string($var);
    return $var;
}

Это все, что нужно для обработки POST и GET данных? Учитывая источник, я боюсь, что это было затуманено для начинающих, и я оставляю себя уязвимым для атаки позже.

Спасибо.

Author: Lightness Races in Orbit, 2009-12-31

4 answers

Невозможно в целом и без разбора "дезинфицировать" входящие данные. Это всегда зависит от того, что вы хотите с этим сделать.

Метод sanitizestring() подходит для очистки содержимого, которому вы не можете доверять (например, из незащищенной формы), которое должно отображаться в выводе HTML вашей страницы. Больше ничего. Он удалит такую информацию, как теги, и изменит специальные символы.

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

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

Для общего обзора того, какую санитарию использовать там, где я думаю, это хороший ответ. Кроме того, если вы собираетесь отправлять электронную почту на основе входящих данных, проверьте Почтовые инъекции.

 3
Author: Pekka 웃, 2017-05-23 10:27:37

Вместо того, чтобы использовать старый драйвер MySQL и mysql_real_escape_string, используйте более современный драйвер, который поддерживает подготовленные операторы (например, PDO).

htmlentities преобразует '' в их эквивалентные сущности символов HTML, поэтому вызов strip_tags после htmlentities не повлияет.

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

 4
Author: outis, 2009-12-31 01:55:32

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

javascript:someFunction()

Что не является проблемой... если только вы не используете этот пользовательский ввод в атрибуте onclick ссылки. Маловероятно? Конечно. Но это доказательство с помощью контрпримера.

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

mysql_real_escape_string() достаточно, чтобы остановить SQL-инъекцию, так что это не проблема. Остановить XSS гораздо более туманно.

 1
Author: cletus, 2009-12-31 01:54:30

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

 0
Author: Peter Loron, 2009-12-31 01:51:48