Php 防止XSS攻击

Php 防止XSS攻击,php,xss,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; e

此代码是否安全以防止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特殊字符进行编码,因为这样会对数据进行操作(编辑数据集时可能会有所不同)。您应该在显示时对其进行编码


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

否-在将数据放入数据库之前过滤数据(这是不必要的),但在输出数据时取消过滤

将数据存储在未筛选的数据库中,并在输出时转义:

 echo htmlspecialchars($unfiltered_data_from_database);

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

那里也有一些陷阱。请看下面的图片。它解释了如何针对不同的上下文进行转义

如果您在标记之间输出不受信任的数据,则htmlspecialchars/htmlentities将保护您,但如果您在javascript事件处理程序中输出数据,则不会保护您,例如:

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

这是因为您是针对HTML而不是javascript进行转义。

在放入DB之前,请确保
mysql\u real\u escape\u string
。@Pekka,但我需要使用标记,这样我会丢失标记,我什么也没做@你知道吗:防止XSS就是对标签进行编码?你也需要像markdown或BBCodes这样的东西。你说的几乎每句话都是对的,但仔细看看OP的代码——他使用
htmlspecialchars()
的方式并不能阻止XSW是否使用htmlspecialchars取决于上下文。请看下面我的答案。这是一个正确方向的开始。你需要显示更多的代码,一个来自你应用程序的真实示例。这仅仅是理论。如果要将数据放入数据库,不要使用
htmlspecialchars
,使用数据库的转义方法(例如
mysql\u real\u escape\u string
)。@Rocket更好的是,使用PDO和准备好的语句,而不是手动转义数据库输入。PHP核心开发团队确实希望废除过时的mysql/mysqli扩展,但他们不能,因为有太多人坚持继续使用它们。对每个人:请尽自己的一份力量鼓励使用事先准备好的语句而不是手动转义。