Это такая неправильная тема!
Вы НЕ должны фильтровать ввод пользователя! Это информация, которую он ввел. Что вы собираетесь делать, если я хочу, чтобы мой пароль был таким: '"'>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 Не совсем уверен, как реагировать на эти отрицательные голоса. Вы действительно читаете мой ответ?
person
Nikola Petkanski
schedule
01.11.2013