Эта тема такая неправильная!
Вы НЕ должны фильтровать ввод пользователя! Это информация, которую он ввел. Что вы будете делать, если я хочу, чтобы мой пароль был таким: '"'>s3cr3t<script>alert()</script>
Отфильтруйте символы и оставьте меня с измененным паролем, чтобы я не смог даже преуспеть в первом входе? Это плохо.
Правильное решение - использовать подготовленные операторы или mysql_real_escape_string()
, чтобы избежать SQL-инъекций, и использовать экранированное экранирование символов, чтобы избежать путаницы в вашем HTML-коде.
Напомню, что Интернет - это только один из способов представления информации, введенной пользователем. Вы бы согласились на такую зачистку, если бы какое-то программное обеспечение для настольных компьютеров делало это? Я надеюсь, что ваш ответ НЕТ, и вы поймете, почему это не правильный путь.
Обратите внимание, что в разных контекстах необходимо экранировать разные символы. Например, если вам нужно отобразить имя пользователя в виде всплывающей подсказки, вы будете использовать что-то вроде:
<span title="{$user->firstName}">{$user->firstName}</span>
Однако, если пользователь установил свое имя как '"><script>window.document.location.href="http://google.com"</script>
, что ты собираешься делать? Убрать цитаты? Это было бы так неправильно! Вместо того чтобы делать это бессмысленно, рассмотрите возможность экранирования кавычек при отображении данных, а не при сохранении их!
Другой контекст, который вы должны учитывать, - это отображение самого значения. Рассмотрим ранее использованный HTML-код и представьте, что имя пользователя будет похоже на <textarea>
. Это обернет весь HTML-код, который следует за этим элементом textarea, что приведет к разбивке всей страницы.
Еще раз - рассмотрите возможность экранирования данных в зависимости от контекста, в котором вы их используете!
P.S Не совсем уверен, как реагировать на эти отрицательные голоса. Вы, люди, действительно читаете мой ответ?