此代码是否安全可防止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;
?>
答案 0 :(得分:8)
在插入数据库时不应对HTML-Specialchars进行编码,这样就可以操纵数据(编辑数据集时可能会有所不同)。你应该在显示时对它们进行编码。
但是,只要你不忘记使用它,htmlspecialchars()
足以阻止XSS。然而,您使用它的方式与以前一样安全。 XSS是通过编码版本来防止的,数据库并不关心它。
答案 1 :(得分:3)
不,XSS独立于数据库。为避免SQL注入,您希望使用类似mysql_real_escape_string的东西进行转义或使用预准备语句,但为了避免使用XSS,您需要在输出到HTML时转义。
还有一些陷阱。看看OWASP XSS prevention cheat sheet。它解释了如何逃避不同的背景。
如果您在标签之间输出不受信任的数据,htmlspecialchars / htmlentities将保护您,但如果您在这样的javascript事件处理程序中输出它,则无法保护您:<button onclick="confirm('do you want to delete <?php echo htmlspecialhars($untrusted_data) ?>')">
这是因为你正在逃避HTML而不是javascript。
答案 2 :(得分:1)
Nope - 您在将数据放入数据库之前对其进行过滤(这是不必要的),但在输出数据时取消了过滤器。
将数据存储在未经过滤的数据库中,并在输出时将其转义:
echo htmlspecialchars($unfiltered_data_from_database);