Что еще я должен сделать для дезинфекции ввода пользователя? - PullRequest
4 голосов
/ 29 октября 2009

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

Функция ниже - это то, что я сейчас использую (остаток от старого разработчика), но я не могу понять, где может лежать потенциальная проблема.

Строка, которая передается в базу данных, будет отображаться через XML, который, в свою очередь, читается приложением Flash.

Может кто-нибудь сказать мне, что я могу упустить? Спасибо

function secure_string($string)
{   
    return (strip_tags(addslashes(mysql_real_escape_string(
                      stripslashes($string)))));
}

Ответы [ 6 ]

5 голосов
/ 29 октября 2009

Лучше использовать новую функцию PHP filter_var () для очистки ввода. Новое и лучшее.

5 голосов
/ 29 октября 2009

Похоже, в этой функции слишком много всего происходит. mysql_real_escape_string() уже экранирует все, что вам нужно, чтобы убежать, поэтому нет необходимости запускать addslashes() на этом. Фактически, он может принести больше вреда, чем пользы, если избежать экранирования, создаваемого mysql_real_escape_string().

2 голосов
/ 29 октября 2009

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

В остальном все зависит от того, что вы хотите. Если вы хотите удалить теги, используйте strip_tags и т. Д.

1 голос
/ 29 октября 2009

Неправильно пытаться исправить проблему при входном времени, поскольку проблема возникает при выходном времени. Смотрите мой ответ здесь:

Каков наилучший метод для дезинфекции ввода пользователя с помощью PHP?

1 голос
/ 29 октября 2009

Если ваш сервер использует php 5.2 или выше, вы должны использовать filter_var для части XML.

$output = filter_var($input, FILTER_SANITIZE_STRING);

Чтобы сохранить что-то в вашей базе данных, используйте PDO и параметризованные запросы.

1 голос
/ 29 октября 2009

Зависит от того, где будет использоваться «защищенная» строка. Если он будет использоваться в базе данных, вам понадобится только mysql_real_escape_string(), ничего больше. Если он будет отображаться в формате HTML, вам нужно всего лишь htmlentities(), и больше ничего. Короче говоря, ваш код слишком много делает, что может быть даже вредно.

Если вы хотите сохранить его в базе данных для последующего отображения в html-формате (например, в комментарии), вам следует использовать mysql_real_escape_string() при хранении строки и htmlentities() при ее отображении.

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