防止XSS攻击

时间:2012-01-19 19:56:16

标签: php 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;        
  ?>

3 个答案:

答案 0 :(得分:8)

在插入数据库时​​不应对HTML-Specialchars进行编码,这样就可以操纵数据(编辑数据集时可能会有所不同)。你应该在显示时对它们进行编码。

但是,只要你不忘记使用它,htmlspecialchars()足以阻止XSS。然而,您使用它的方式与以前一样安全。 XSS是通过编码版本来防止的,数据库并不关心它。

答案 1 :(得分:3)

不,XSS独立于数据库。为避免SQL注入,您希望使用类似mysql_real_escape_string的东西进行转义或使用预准备语句,但为了避免使用XSS,您需要在输出到HTML时转义。

还有一些陷阱。看看OWASP XSS prevention cheat sheet。它解释了如何逃避不同的背景。

如果您在标签之间输出不受信任的数据,htmlspecialchars / htmlentities将保护您,但如果您在这样的javascript事件处理程序中输出它,则无法保护您:

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

这是因为你正在逃避HTML而不是javascript。

答案 2 :(得分:1)

Nope - 您在将数据放入数据库之前对其进行过滤(这是不必要的),但在输出数据时取消了过滤器。

将数据存储在未经过滤的数据库中,并在输出时将其转义:

 echo htmlspecialchars($unfiltered_data_from_database);