【发布时间】:2015-11-01 00:59:32
【问题描述】:
首先是我的数据库表的示例:
+----+-----------+-------------------------------------+
| id | user_id | text |
+----+-----------+-------------------------------------+
| 12 | 45 | Hi, <br>this is an example. <br>Bye |
+----+-----------+-------------------------------------+
我一直使用 MySQLi 准备好的语句,所以 SQL 注入已经没有问题了,不是吗?
现在 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.';
}
【问题讨论】:
-
不。我的问题不是 sql 部分,更多的是显示用户输入部分,但允许
<br>。 -
那么请将您的标题编辑为如何保持
并避免SQL注入或XSS? -
strip_tags() 允许您将一组不会被剥离的标签列入白名单
-
这对所有可能的 xss 安全吗?
-
@KlippOhei 不,strip_tags 对 XSS 毫无用处