Предотвращение атак XSS

Безопасен ли этот код для предотвращения атак XSS?

<?php $string = "<b>hello world!</b>"; echo "without filtering:".$string; echo "<br>"; $filtered = htmlspecialchars($string); // insert into database filtered echo "After filtering:".$filtered; echo "<br>"; $de_filtering = htmlspecialchars_decode($filtered); //retrieve from database and display echo "After de-filtering:".$de_filtering; ?> 

Вы не должны кодировать HTML-Specialchars при вставке в базу данных, таким образом обрабатываются данные (и, возможно, разные при редактировании набора данных). Вы должны их кодировать при отображении.

Но да, htmlspecialchars() достаточно, чтобы предотвратить XSS, если вы не забудете его использовать. Таким образом, вы используете его, как и прежде. XSS предотвращается через кодированную версию, база данных не заботится об этом.

Нет, XSS не зависит от базы данных. Чтобы избежать SQL-инъекции, вы хотите избежать использования чего-то вроде mysql_real_escape_string или использовать подготовленные операторы, но чтобы избежать XSS, вам нужно сбежать при выводе в HTML.

И есть еще пара ошибок. Взгляните на чит-лист OWASP XSS . В нем объясняется, как сбежать для разного контекста.

htmlspecialchars / htmlentities будут защищать вас, если вы выведете недоверенные данные между тегами, но не будете защищать вас, если вы выведете его в качестве обработчика событий javascript, например:

 &lt;button onclick="confirm('do you want to delete &lt;?php echo htmlspecialhars($untrusted_data) ?&gt;')"&gt; 

Это потому, что вы ускользаете для HTML, а не для javascript.

Нет. Вы фильтруете данные перед тем, как поместить их в базу данных (что необязательно), но отменив фильтр при выводе данных.

Храните данные в базе данных без фильтрации и избегайте их при выводе:

  echo htmlspecialchars($unfiltered_data_from_database);