如何安全地抵御 XSS 攻击但又允许 <br>

Posted

技术标签:

【中文标题】如何安全地抵御 XSS 攻击但又允许 <br>【英文标题】:How to be safe against XSS attacks but allowing <br> 【发布时间】:2015-11-01 00:59:32 【问题描述】:

首先是我的数据库表的示例:

+----+-----------+-------------------------------------+
| id | user_id   | text                                |
+----+-----------+-------------------------------------+
| 12 | 45        | Hi, <br>this is an example. <br>Bye |
+----+-----------+-------------------------------------+

我一直使用 mysqli 准备好的语句,所以 SQL 注入已经没有问题了,不是吗?

现在 XSS 攻击的问题:

我想安全地从数据库表中显示文本,所以常用的方法是htmlentitiesENT_QUOTES,如下所示:

htmlentities($ValueFromDatabase, ENT_QUOTES, 'UTF-8');  

但我不想转义数据库中的&lt;br&gt; 标签。

除了&lt;br&gt;,怎么能逃脱所有危险的事情呢?还是有另一种显示断线的方法(带数据库)?

编辑:可能的解决方案?

//------INSERTING------
if (isset($userinput) AND $userinput != "") 
    $userinput = $_POST['userinput'];
 else 
    //Error Handling
    exit;


$userinput2 = nl2br($userinput);
$userinput3 = str_replace("<br />","[br]",$userinput2);

$sql = $mysqli->prepare('INSERT INTO table (col1) VALUES (?)');
$sql->bind_param('s', $userinput3);
$sql->execute();

//------DISPLAYING------
$sql = $mysqli->prepare('SELECT userinput FROM table WHERE userid = ?');
$sql->bind_param('i', $userid);
$sql->execute();
$sql->store_result();
$sql->bind_result($userinput);
$sql_rows = $sql->num_rows;

if ($sql_rows != 0) 
    while ($sql->fetch()) 
        echo str_replace("[br]","<br />",htmlentities($userinput, ENT_QUOTES, "UTF-8"));
    
 else 
    echo'No rows in the database.';

【问题讨论】:

不。我的问题不是 sql 部分,更多的是显示用户输入部分,但允许 &lt;br&gt; 那么请将您的标题编辑为如何保持并避免SQL注入或XSS? strip_tags() 允许您将一组不会被剥离的标签列入白名单 这对所有可能的 xss 安全吗? @KlippOhei 不,strip_tags 对 XSS 毫无用处 【参考方案1】:

你真的应该试试http://htmlpurifier.org/ 这是一个很好的库,旨在防止 XSS,它仍然允许一些标签,如 和其他安全标签。

【讨论】:

以上是关于如何安全地抵御 XSS 攻击但又允许 <br>的主要内容,如果未能解决你的问题,请参考以下文章

使用htmlentities( )函数抵御跨站点脚本(XSS)攻击

带有 <script> 后跟 <br/> 的 XSS

SpringBoot 项目添加抵御跨站防御脚本(XSS)攻击功能

抵御即跨站脚本(XSS)攻击

JeecgBoot抵御XSS攻击实现方案

什么是DDoS攻击?如何抵御DDos攻击?