如何安全抵御XSS攻击但允许使用

时间:2015-08-08 18:17:50

标签: php mysql xss

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

+----+-----------+-------------------------------------+
| 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>之外,如何逃脱所有危险的事情?或者是否有另一种displayig断行方法(带数据库)?

编辑:可能的解决方案?

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

1 个答案:

答案 0 :(得分:0)

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