Я разрабатываю приложение, использующее WordPress в качестве CMS.
У меня есть форма с большим количеством полей ввода, которые необходимо очистить перед сохранением в базе данных.
Я хочу предотвратить SQL-инъекцию, используя javascript и PHP-код и другой вредоносный код.
В настоящее время я использую свои собственные методы для дезинфекции данных, но я считаю, что лучше использовать функции, которые использует WP.
Я посмотрел на Data Validation в WordPress, но я не уверен, сколько из этих функций я должен использовать и в каком порядке. Может ли кто-нибудь сказать, какие функции WP лучше всего использовать?
В настоящее время я «дезинфицирую» свой вклад, выполняя следующие действия:
Потому что персонажи с акцентами (é, ô, æ, ø, å) были загружены забавным способом в базе данных (хотя мои таблицы установлены как ENGINE=InnoDB
, DEFAULT CHARSET=utf8
и COLLATE=utf8_danish_ci
), теперь я конвертируя поля ввода, которые могут иметь акценты, используя htmlentities ().
При создании строки SQL для ввода данных я использую mysql_real_escape_string()
.
Я не думаю, что этого достаточно, чтобы предотвратить атаки. Поэтому предложения по улучшению очень ценятся.
Ввод «санитария» является фиктивным.
Вам не следует пытаться защитить себя от проблем с инъекциями путем фильтрации (*) или выхода из строя, вы должны работать с необработанными строками до тех пор, пока вы не поместите их в другой контекст. В этот момент вам понадобится правильная функция экранирования для этого контекста, которая представляет собой 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
. Затем проверьте, что ваше соединение MySQL установлено на UTF-8, например, с помощью mysql_set_charset()
.
При создании строки SQL для ввода данных я использую mysql_real_escape_string ().
Да, это правильно. Пока вы это делаете, вы не уязвимы для SQL-инъекций. Вы можете быть уязвимы к HTML-инъекции (вызывая XSS), если вы используете HTML-экранирование в конце базы данных, а не в конце вывода шаблона. Поскольку любая строка, которая не прошла через базу данных (например, полученную непосредственно из $_GET
), не будет экранирована с помощью HTML.