这段代码是否安全可以防止XSS攻击?
<?php
$string = "<b>hello world!</b>";
echo "without filtering:".$string;
echo "<br>";
$filtered = htmlspecialchars($string); // insert into database filtered
echo "After filtering:".$filtered;
echo "<br>";
$de_filtering = htmlspecialchars_decode($filtered); //retrieve from database and display
echo "After de-filtering:".$de_filtering;
?>
Run Code Online (Sandbox Code Playgroud)
在插入数据库时,不应对HTML-Specialchars进行编码,这样就可以操纵数据(编辑数据集时可能会有所不同).你应该在显示时对它们进行编码.
但是,htmlspecialchars()只要你不忘记使用它就足以阻止XSS了.然而,您使用它的方式与以前一样安全.通过编码版本阻止XSS,数据库不关心它.
不,XSS 独立于数据库。为了避免 SQL 注入,您需要使用 mysql_real_escape_string 或使用准备好的语句进行转义,但为了避免 XSS,您需要在输出到 HTML 时进行转义。
还有一些问题。查看OWASP XSS 预防备忘单。它解释了如何针对不同的上下文进行转义。
如果您在标签之间输出不受信任的数据,htmlspecialchars/htmlentities 会保护您,但如果您在 JavaScript 事件处理程序中输出它,则不会保护您,如下所示:
<button onclick="confirm('do you want to delete <?php echo htmlspecialhars($untrusted_data) ?>')">
Run Code Online (Sandbox Code Playgroud)
这是因为您正在转义 HTML 而不是 javascript。