Я услышал, что это утверждало, что простое решение предотвращения атак с использованием кода на SQL к HTML, кодируют весь текст прежде, чем вставить в базу данных. Затем очевидно, декодируйте весь текст при извлечении его. Причем идея состоит в том, что, если текст только содержит амперсанды, точки с запятой и буквенно-цифровой индикатор затем, Вы не можете сделать ничего злонамеренного.
В то время как я вижу много случаев, где это, может казаться, работает, я предвижу следующие проблемы в использовании этого подхода:
Есть ли что-нибудь, что я пропускаю?
Это - на самом деле разумный подход к проблеме предотвращения атак с использованием кода на SQL?
Есть ли какие-либо фундаментальные проблемы с попыткой предотвратить инжекционные нападения таким образом?
Вы должны предотвратить внедрение sql с помощью привязки параметров (например, никогда не объединяйте свои строки sql с пользовательским вводом, а используйте заполнители для параметров и позволяйте фреймворку вы используете правильный экранирование). С другой стороны, для предотвращения межсайтового скриптинга следует использовать кодировку Html.
Абсолютно нет.
SQL-инъекции следует предотвращать с помощью параметризованных запросов. Или, в худшем случае, экранируя параметр SQL для SQL, а не HTML. Каждая база данных имеет свои собственные правила по этому поводу, например, mysql API (и большинство фреймворков) предоставляет для этого определенную функцию. Сами данные в базе данных не должны изменяться при хранении.
Экранирование сущностей HTML предотвращает XSS и другие атаки при возврате веб-контента в браузеры клиентов.
Единственный символ, который включает SQL-инъекцию, - это разделитель строк SQL '
, также известный как шестнадцатеричный 27 или десятичный 39.
Этот символ представлен в SQL и HTML одинаково. Таким образом, кодирование HTML вообще не влияет на атаки с использованием SQL-инъекций.
Откуда у вас идея, что HTML-кодированный текст после декодирования содержит только амперсанды, полуколонки и буквенно-цифровые символы?
Я действительно могу закодировать "'" в HTML - и это одна из вещей, необходимых для того, чтобы у вас возникли проблемы (поскольку это разделитель строк в SQL).
Итак, это работает ТОЛЬКО если вы помещаете закодированный HTML текст в базу данных.
И тогда у вас возникают проблемы с любым текстовым поиском... и представлением читаемого текста снаружи (как в SQL-менеджере). Я бы счел это действительно плохой архитектурной ситуацией, поскольку вы не решили проблему, а просто заклеили скотчем очевидный вектор атаки.
Числовые поля все еще проблематичны, если только ваша обработка HTML не совершенна, чего я не предполагаю, учитывая этот обходной путь.
Используйте параметры SQL ;)