Дезинфекция ввода текста перед отправкой в ​​базу данных MySQL

В настоящее время я работаю над тем, чтобы убедиться, что текст, который отправляется в базу данных для веб-приложения, над которым я работаю, правильно очищается перед отправкой в ​​​​базу данных, а затем правильно извлекается и отображается.

Игнорируя беспорядок функций дезинфекции, которые используются в настоящее время (в настоящее время это беспорядок и все ломается), вот что я планирую сделать:

  1. Используйте CKEditor для ввода текста. Он автоматически преобразует теги/символы HTML в их объекты HTML.

  2. Используйте подготовленные операторы PDO для отправки текста в базу данных.

Достаточно ли этого для правильной очистки ввода? Я читал об этом, и многие люди говорят, что нужно использовать волшебные кавычки, однако я читал, что волшебные кавычки устарели, и я не рекомендую их использовать.

Заранее благодарим за любую помощь!


person mrinehart93    schedule 19.02.2013    source источник
comment
1. Это хорошо, но правильно используйте данные на сайте использования (т.е. кодируйте при выводе HTML); 2. Подготовленные операторы исключают внедрение SQL, но они не устраняют неправильное использование данных в других местах (например, XSS, HTML, внедрение exec). Волшебные кавычки были плохой идеей, которая пыталась — и не смогла — исправить адрес № 2. Дезинфекция бизнес-правил должна быть выполнена, но для корректности информации, а не [обязательно] с точки зрения внедрения данных.   -  person    schedule 20.02.2013
comment
@pst, поэтому я должен делать то, что говорят все остальные, и использовать htmlspecialchars при выводе ввода из базы данных? Будет ли это мешать CKEditor заменять HTML-теги/символы их объектами?   -  person mrinehart93    schedule 20.02.2013
comment
Да, всегда кодировать вывод! (За исключением случаев, когда есть действительно веская причина не делать этого.) Лично я не кодирую ввод. В противном случае в базе данных будет куча .. мусора .. Храните информацию такой, какой она должна быть. Хотя может иметь смысл преобразовывать содержимое текстового редактора в нормализованный формат (например, markdown/markup/bbcode), я бы не рекомендовал хранить его в кодировке html, так как базы данных не заботятся о HTML. Однако бизнес-правила могут указывать, что разрешены только элементы <em> и <a> — теперь это должно применяться, поскольку оно является частью информации.   -  person    schedule 20.02.2013


Ответы (2)


Что ж, с PDO все в порядке только с базовыми случаями из руководства для начинающих.
Какая бы сложная проблема ни привела к проблемам с PDO, как и с любым другим API.

Но пока вы готовы тратить свое время на написание огромных операторов вставки, повторяя каждую переменную шесть-десять раз, следуя всем этим ответам здесь, PDO в порядке.

Но просто чтобы вы знали, для идентификаторов нет подготовленного заявления.

Что касается CKEditor — разве это не клиентское приложение? Если это так, это ничего не защитит.
Итак, лучше следуйте совету из другого ответа - пропустите ненадежный пользовательский ввод через htmlspecialchars() при отображении его на HTML-странице.

person Your Common Sense    schedule 19.02.2013
comment
Спасибо за ваш ответ. CKEditor — клиентское приложение. Одной из причин, по которой я решил использовать его, был тот факт, что он заменил HTML-теги и символы HTML-сущностями... у пользователей, использующих приложение, была ОЧЕНЬ плохая привычка копировать и вставлять в приложение все, что они находили, поэтому CKEditor помогает установить стандарт для того, что входит в базу данных. - person mrinehart93; 20.02.2013

Не используйте магические кавычки. http://php.net/manual/en/security.magicquotes.php

Эта функция УСТАРЕЛА, начиная с PHP 5.3.0, и УДАЛЕНА, начиная с PHP 5.4.0.

Если вы используете подготовленные операторы, вы должны быть в безопасности от внедрения sql. Не забудьте пропустить введенные пользователем данные через htmlspecialchars() при отображении их на интерфейсе.

person Mike B    schedule 19.02.2013
comment
Итак, при отображении информации из базы данных (которая будет иметь HTML-элементы, такие как '), я должен использовать htmlspecialchars перед отображением ее пользователю? - person mrinehart93; 20.02.2013