这段代码是否安全,可以防止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;
?>
发布于 2012-01-20 03:58:28
在插入到数据库中时,您不应该对HTML-Specialchars进行编码,因为数据是以这种方式操作的(在编辑数据集时可能会有所不同)。您应该在显示时对它们进行编码。
但是,是的,只要您不忘记使用htmlspecialchars()
,它就足以防止XSS。但是,您使用它的方式和以前一样安全。通过编码版本阻止了XSS,数据库并不关心它。
发布于 2012-01-21 03:08:12
不,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。
发布于 2012-01-20 03:58:41
不-在将数据放入数据库之前对数据进行过滤(这是不必要的),但在输出数据时取消过滤。
将数据不过滤地存储在数据库中,并在输出时对其进行转义:
echo htmlspecialchars($unfiltered_data_from_database);
https://stackoverflow.com/questions/8932431
复制相似问题