Комплексная защита от ввода данных пользователем - PHP, MySQL

Возможный дубликат:
Какой лучший метод очистки пользовательского ввода с помощью PHP?
Каковы лучшие функции очистки ввода PHP?
Полная очистка / безопасная функция

Цель: правильно очистить все данные, вводимые в текстовых полях, перед вводом в базу данных, которая затем выводится на страницу. В моем случае мне нужно предотвратить потенциальные проблемы, не исключая ввода данных. Кроме того, кодировка явно установлена ​​на UTF-8 как в заголовке HTTP, так и в теге META, чтобы предотвратить проблемы с искаженным кодированием. DB также установлен в UTF-8.

Технические характеристики: PHP, MySQL, Apache.

Образец кода:

    function secureinput($input)
    {
       $input = htmlspecialchars($input, ENT_QUOTES ,'UTF-8');
       $input = strip_tags($input); //fail-safe for anything that gets through
       $input = mysql_real_escape_string($input);

       return $input;
    }

Вопрос: для каких векторов атаки (XSS, SQL-инъекция и т. д.) это все еще уязвимо?

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


person Community    schedule 28.07.2012    source источник
comment
Чтобы вывести безопасность на новый уровень, начните использовать PDO (или mysqli) вместо функций mysql_ *. ;)   -  person Bono    schedule 29.07.2012
comment
Вам также следует использовать параметризованный SQL на 100% исключает риск внедрения SQL.   -  person Tushar    schedule 29.07.2012
comment
Не существует волшебной функции безопасности / дезинфекции «все сразу». Все зависит от контекста. То, что у вас есть хрень.   -  person mario    schedule 29.07.2012
comment
Этот самый вопрос задавался снова и снова: stackoverflow.com/q/129677/112968   -  person knittl    schedule 29.07.2012
comment
Я бы выбрал готовые решения из фреймворков или библиотек, вместо того, чтобы создавать решение с нуля. Где-то в коде всегда будет дыра в безопасности ..   -  person Gntem    schedule 29.07.2012
comment
@Bono: Да, мне следовало использовать команды mysqli_ *, а не устаревшие mysql_ *.   -  person    schedule 29.07.2012
comment
Использование PDO и проверка типа (числа, текст и т. Д.) И длины входных данных является обязательным, хотя и за пределами написанного мною образца кода. Я пытаюсь определить, адекватно ли это обеззараживает от атаки данные, которые будут выводиться обратно на экран, или если кто-то видит что-то яркое (очевидно, что нет 100%).   -  person    schedule 29.07.2012
comment
@mario: Да, я пропустил это. Спасибо, что указали на это. Однако просто называть этот пример кода чушью и не указывать, почему, бессмысленно.   -  person    schedule 29.07.2012
comment
Вам следует прочитать Окончательная функция очистки / безопасности, это в основном то, о чем вы просите.   -  person Gumbo    schedule 29.07.2012


Ответы (1)


XSS-атаки

Используя htmlspecialchars () всякий раз, когда вы выводите введенный пользователем контент, вы можете быть уверены, что будете защищены от XSS-атак.

SQL-инъекция

Стив Фридл приводит несколько примеров SQL-инъекций и ограничений очистки ввода на своем веб-сайте: http://www.unixwiz.net/techtips/sql-injection.html

Даже если ваш код может быть защищен от атак SQL-инъекций с помощью mysql_real_escape_string (), лучше использовать параметризованный SQL и полностью исключить риск SQL-инъекций. Вы также будете в большей безопасности, если будете использовать PDO или mysqli в PHP вместо устаревших функций mysql.

person Tushar    schedule 28.07.2012