首先以我的数据库表为例:
+----+-----------+-------------------------------------+
| id | user_id | text |
+----+-----------+-------------------------------------+
| 12 | 45 | Hi, <br>this is an example. <br>Bye |
+----+-----------+-------------------------------------+
我总是使用 MySQLi 预处理语句,所以 SQL 注入(inject)不再是问题,不是吗?
现在XSS攻击的问题:
我想安全地显示数据库表中的文本,所以常用的方法是 htmlentities
与 ENT_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/