Эта пара функций подходит для дезинфекции?
Это было взято из O'Reilly's Learn 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 ответа
Невозможно вообще и без разбора "санировать" входящие данные. Это всегда зависит от того, что вы хотите с ним делать.
Метод sanitizeString() подходит для очистки контента, которому вы не можете доверять (например, из незащищенной формы), который должен отображаться в выводе HTML вашей страницы. Ничего больше. Он удалит такую информацию, как теги, и изменит специальные символы.
Это сделает метод sanitizeMySQL() и сделает его безопасным для использования в MySQL Query. Опять же, это полезно, только если вы хотите сократить пользовательский ввод, например, для гостевой книги или чата. Если у вас есть 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. Это помогает предотвратить пропущенную дезинфекцию.