php - 如何安全抵御 XSS 攻击但允许 <br>

标签 php mysql xss

首先以我的数据库表为例:

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

我总是使用 MySQLi 预处理语句,所以 SQL 注入(inject)不再是问题,不是吗?

现在XSS攻击的问题:

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

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

但我不想逃避 <br>数据库中的标签。

如何才能逃避一切危险的事情却<br> ?或者是否有另一种显示中断线的方法(使用数据库)?

编辑:可能的解决方案?

//------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.';
}

最佳答案

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

关于php - 如何安全抵御 XSS 攻击但允许 <br>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31897091/

相关文章:

php - MYSQL PHP查询将数据从一个表获取到另一个表

mysql - 左连接不返回 Null 或不匹配的值

javascript - 为什么即使两个 URL 都来自 XXXX.com,我仍然收到 405 错误?

php - 通过 cPanel cron 自动备份 MySQL 数据库和发送电子邮件

php - 我需要在 mysql 中显式删除 View 吗?

php - 我的服务器上没有 cron 作业。在没有用户输入的情况下发送电子邮件的替代方法是什么?

mysql - SQL : Duplicate rows with unique values and change a column value

mysql - 获取 MySQL 行结果到动态数组

spring-security - Spring Security 原生 XSS 过滤器

xss - 具有隐藏输入的跨站脚本