Нужно ли мне htmlentities () или htmlspecialchars () в подготовленных операциях?

В статье http://dev.mysql.com/tech-resources/articles/4.1/prepared-statements.html говорится следующее:

Существует множество преимуществ использования подготовленных заявлений в ваших приложениях как по соображениям безопасности, так и по производительности.

Подготовленные утверждения могут помочь повысить безопасность, отделив логику SQL от поставляемых данных. Такое разделение логики и данных может помочь предотвратить очень распространенный тип уязвимости, называемый атакой SQL-инъекции.

Обычно, когда вы имеете дело с специальным запросом, вы должны быть очень осторожны при обработке данных, полученных от пользователя. Это подразумевает использование функций, которые устраняют все необходимые символы ошибки, такие как одинарная кавычка, двойная кавычка и символы обратной косой черты.

Это необязательно при работе с подготовленными заявлениями . Разделение данных позволяет MySQL автоматически принимать во внимание эти символы, и их не нужно избегать с помощью какой-либо специальной функции.

Означает ли это, что мне не нужны htmlentities() или htmlspecialchars() ? Но я предполагаю, что мне нужно добавить strip_tags() к пользовательским входным данным? Я прав?

htmlentities и htmlspecialchars используются для генерации вывода HTML, который отправляется в браузер.

Подготовленные операторы используются для генерации / отправки запросов в механизм базы данных .

Оба позволяют избежать данных; но они не убегают при одинаковом использовании.
Таким образом, никакие подготовленные операторы (для SQL-запросов) не мешают вам правильно использовать htmlspecialchars / htmlentities (для генерации HTML)

О strip_tags : он удалит теги из строки, где htmlspecialchars преобразует их в объекты HTML.
Эти две функции не делают то же самое; вы должны выбрать, какой из них использовать в зависимости от ваших потребностей / того, что вы хотите получить.

Например, с помощью этого фрагмента кода:

 $str = 'this is a <strong>test</strong>'; var_dump(strip_tags($str)); var_dump(htmlspecialchars($str)); 

Вы получите такой вывод:

 string 'this is a test' (length=14) string 'this is a &lt;strong&gt;test&lt;/strong&gt;' (length=43) 

В первом случае нет метки; во втором, правильно экранированном.

И с выходом HTML:

 $str = 'this is a <strong>test</strong>'; echo strip_tags($str); echo '<br />'; echo htmlspecialchars($str); 

Ты получишь:

 this is a test this is a <strong>test</strong> 

Какой из них вы хотите? Это важный вопрос 😉

Для htmlspecialchars() ничего не меняется, потому что это для HTML, а не для SQL. Вам все равно нужно избегать HTML правильно, и лучше всего это делать, когда вы на самом деле генерируете HTML, а не привязываете его к базе данных.

Если вы используете подготовленные инструкции, вам больше не понадобится mysql_[real_]escape_string() (при условии, что вы придерживаетесь заполнителей подготовленных операторов и избегаете соблазна обходить его с помощью манипуляции с строкой).

Если вы хотите избавиться от htmlspecialchars() , то есть механизмы HTML-шаблонов, которые htmlspecialchars() работают с подготовленными операторами SQL и освобождают вас от выполнения всего вручную, например PHPTAL .

Вам не нужны htmlentities () или htmlspecialchars () при вводе материала в базу данных, ничего плохого не произойдет, вы не будете уязвимы для SQL-инъекций, если используете готовые заявления. Хорошо, что теперь вы сохраните первоначальный пользовательский ввод в своей базе данных.

Вам нужно скрывать данные на выходе и отправлять их клиенту, – когда вы вытаскиваете материал из базы данных, вы будете уязвимы для межсайтовых скриптовых атак и других плохих вещей. Вам нужно будет избежать их для нужного формата вывода, например html, поэтому вам понадобятся htmlentities и т. Д.

По этой причине вы можете просто уйти от вещей, поскольку вы помещаете их в базу данных, а не когда вы ее выводите, – однако вы потеряете исходное форматирование пользователя, и вы избежите данных для использования html, которые могут не окупиться, если вы используете данные в разных форматах вывода.

подготовиться к SQL-инъекции
htmlspecialchar для XSS (перенаправление на другую ссылку)

 <?php $str = "this is <script> document.location.href='https://www.google.com';</script>"; echo $str; 

вывод : это … и перенаправление на google.com

Использование htmlspecialchars :

 $str = "this is <script> document.location.href='https://www.google.com';</script>"; echo htmlspecialchars($str); <i>output1</i>: this is <script> document.location.href='https://www.google.com';</script> (in output browser)<br /> <i>output2</i>: this is &lt;script&gt; document.location.href='https://www.google.com';&lt;/script&gt; (in view source)<br /> 

Если пользователь вводит комментарий «скрипт» в базу данных, тогда браузер отображает все комментарии из базы данных, автоматически «сценарий» будет выполнен и перенаправлен на google.com

Так,
1. используйте htmlspecial для деактивации неправильного тега скрипта
2. использовать подготовку к безопасной базе данных

htmlspecialchars
htmlspecialchars_decode
проверка подлинности php

Я все равно был бы склонен кодировать HTML. Если вы создаете какую-либо форму CMS или веб-приложения, ее легче хранить в виде закодированного HTML, а затем перекодировать по мере необходимости.

Например, при вводе информации в TextArea, измененной TinyMCE, они рекомендуют, чтобы HTML был закодирован – поскольку спецификация HTML не позволяет HTML внутри текстовой области.

Я бы также strip_tags() из любого места, где вам не нужен HTML-код.