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

Это было взято из 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. Это помогает предотвратить пропущенную дезинфекцию.

Другие вопросы по тегам