Ввод «дезинфекции» является поддельным.
Вы не должны пытаться защитить себя от проблем с внедрением, фильтруя (*) или избегая ввода, вы должны работать с необработанными строками до тех пор, пока вы не поместите их в другой контекст. На этом этапе вам нужна правильная функция экранирования для этого контекста, которая составляет mysql_real_escape_string
для запросов MySQL и htmlspecialchars
для вывода HTML.
(WordPress добавляет свои собственные экранирующие функции, такие как esc_html
, которые в принципе не отличаются.)
(*: хорошо, за исключением требований к конкретному приложению, таких как проверка адреса электронной почты - это действительно адрес электронной почты, обеспечение разумного пароля и т. Д. Также есть разумный аргумент для фильтрации управляющих символов на этапе ввода, хотя на самом деле это редко делается.)
Сейчас я конвертирую поля ввода, которые могут иметь акценты, используя htmlentities ().
Я настоятельно советую не делать этого. Ваша база данных должна содержать необработанный текст; Вы значительно усложняете операции с базами данных над столбцами, если вы закодировали его как HTML. Вы экранируете такие символы, как <
и "
одновременно с символами не-ASCII. Когда вы получаете данные из базы данных и используете их по какой-то другой причине, а не копируете их на страницу, у вас теперь есть ложные экранированные данные в данных. Не уходите с HTML, пока в последний момент не напишите текст на страницу.
Если у вас возникли проблемы с вводом в базу данных не-ASCII символов, это другая проблема, которую вы должны решить в первую очередь, вместо того, чтобы идти на неустойчивые обходные пути, такие как хранение данных в формате HTML. Здесь есть несколько сообщений о том, как заставить PHP и базы данных говорить о правильном UTF-8, но главное - убедиться, что ваши выходные HTML-страницы правильно обслуживаются как UTF-8 с использованием заголовка / мета Content-Type
. Затем убедитесь, что ваше соединение MySQL установлено в UTF-8, например, используя mysql_set_charset()
.
При создании строки SQL для ввода данных я использую mysql_real_escape_string ().
Да, это правильно. Пока вы делаете это, вы не уязвимы для SQL-инъекций. Вы могли бы быть уязвимы к HTML-инъекции (вызывая XSS), если вы экранируете HTML на конце базы данных вместо конца вывода шаблона. Потому что любая строка, которая не прошла через базу данных (например, извлечена непосредственно из $_GET
), не будет экранирована HTML.