Подходит ли эта пара функций для дезинфекции?
Это было взято из Учебника О'Рейли по 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
данных? Учитывая источник, я боюсь, что это было затуманено для начинающих, и я оставляю себя уязвимым для атаки позже.
Спасибо.
4 answers
Невозможно в целом и без разбора "дезинфицировать" входящие данные. Это всегда зависит от того, что вы хотите с этим сделать.
Метод sanitizestring() подходит для очистки содержимого, которому вы не можете доверять (например, из незащищенной формы), которое должно отображаться в выводе HTML вашей страницы. Больше ничего. Он удалит такую информацию, как теги, и изменит специальные символы.
Метод sanitizemysql() сделает это, плюс сделайте его безопасным для использования в запросе MySQL. Опять же, это полезно только в том случае, если вы хотите удалить пользовательский ввод, например, для гостевой книги или почтового ящика. Если бы у вас была CMS с авторизованными пользователями, вы бы не захотели этого делать.
Ни при каких обстоятельствах не всегда применяйте это ко всем входящим переменным. Например, если у вас есть форма заказа, которая пересылается вам по электронной почте, htmlspecialchars()
преобразует все специальные символы в сущности, которые отображаются буквально (например, "
) только в текстовом электронном письме. Ты бы не хотел этого делать.
Для общего обзора того, какую санитарию использовать там, где я думаю, это хороший ответ. Кроме того, если вы собираетесь отправлять электронную почту на основе входящих данных, проверьте Почтовые инъекции.
Вместо того, чтобы использовать старый драйвер MySQL и mysql_real_escape_string
, используйте более современный драйвер, который поддерживает подготовленные операторы (например, PDO).
htmlentities
преобразует '' в их эквивалентные сущности символов HTML, поэтому вызов strip_tags
после htmlentities
не повлияет.
stripslashes
должен вызываться только в том случае, если включены магические кавычки (используйте get_magic_quotes_gpc
и get_magic_quotes_runtime
чтобы проверить это).
Нет функции волшебной пули, чтобы сделать ввод данных пользователем безопасным, потому что это полностью зависит от того, что вы с ним делаете. Например, если у вас есть текстовое поле и вы используете его с описанной выше функцией, оно очистит эту строку:
javascript:someFunction()
Что не является проблемой... если только вы не используете этот пользовательский ввод в атрибуте onclick ссылки. Маловероятно? Конечно. Но это доказательство с помощью контрпримера.
Вы должны понимать, для чего вы используете пользовательский ввод, какие уязвимости он может привести или эксплуатируйте, а затем действуйте соответствующим образом.
mysql_real_escape_string()
достаточно, чтобы остановить SQL-инъекцию, так что это не проблема. Остановить XSS гораздо более туманно.
Хорошее начало. В идеале, для вещей, которые не являются произвольной формой, вы могли бы использовать входные данные в операторе switch (или что-то еще) для поиска жестко закодированных значений для перехода в SQL. Это помогает предотвратить то, что пропустила дезинфекция.