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