我正在尝试从恶意代码中过滤用户的输入,以防止XSS攻击。当用户提交输入时,输入将通过以下检查: 输入包含在$ post变量中。
$post = htmlspecialchars($post);
$id = $_SESSION['loggedIn'];
$sql = "UPDATE playerstats SET message='$post' WHERE id = $id";
$db->query($sql);
header("location: ?page=message");
是的,我知道我没有使用准备好的语句,但是我只是出于测试目的而编写了该代码。好的,可以。在数据库中,我看到
<script>top.location.href = "?page=message";</script>
因此,在该消息页面中,我看到了刚刚插入的帖子。但是我看不到htmlspecialchars的效果吗?当它提交到数据库时,它影响了帖子,但是当我在消息页面中显示它时..我再次看到
<script>top.location.href = "?page=message";</script>
知道为什么会这样吗? htmlspecialchars命令仅用于输出吗?
答案 0 :(得分:4)
htmlspecialchars
的要点是删除任何 HTML 特殊字符,并用“&”号代替,后者将显示该字符但不会被解释为HTML。这对XSS攻击非常有效(但对SQL注入无效)。
这意味着,如果您将字符串<script>malicousCode</script>
到htmlspecialchars
,并将其回显到页面中,则用户将看到实际的字符串。如果您不通过htmlspecialchars
放置它,浏览器会认为它是<script>
标记并执行malicousCode。
这本身不会阻止SQL注入!它仅用于清理要显示给用户的字符串。
为防止SQL注入使用预处理语句(我不鼓励您使用mysqli_real_escape_string
之类的任何其他转义形式,因为使用预处理语句使其完全不可能)
答案 1 :(得分:1)
是的,这是htmlspecialchars的正确用法
$post = htmlspecialchars($post);
这是另一个示例:
<?php
$str = "This is some <b>bold</b> text.";
echo htmlspecialchars($str);
?>
上面代码的HTML输出为(查看源代码):
<!DOCTYPE html>
<html>
<body>
This is some <b>bold</b> text.
</body>
</html>
上面代码的浏览器输出将是:
This is some <b>bold</b> text.
摘要:
htmlspecialchars()函数将一些预定义的字符转换为HTML实体。
预定义字符是:
& (ampersand) becomes &
" (double quote) becomes "
' (single quote) becomes '
< (less than) becomes <
> (greater than) becomes >
答案 2 :(得分:1)
.foldLeft[ErrorOr[Map[String, String]]]
编码html字符,例如htmlspecialchars
将替换为<tag>
。当您从数据库中加载该字符串并显示它时,浏览器仍将<tag>
显示为<tag>
,但浏览器不会将其视为html指令。因此,在页面源中,您仍然会看到编码后的<tag>
。
如果要使用页面上的字符串,以便将其解释为普通的html命令,则必须在从数据库加载内容后使用<tag>
(Docs)将其转换回来。
htmlspecialchars_decode
如果出于安全方面的考虑,为了保护您免受SQL注入而希望转义输入,则可以改用mysqli_real_escape_string。
但是使用prepared statements是最佳选择,因为您可以准确地定义期望的语句参数,并且提供的值不会弄乱它。即使只是出于测试目的,并且实施起来并不困难,这也是推荐的方法。
因此,您使用 mysqli 和准备好的语句的示例为:
loaded_from_db = htmlspecialchars_decode(value);
请注意,我没有进行任何错误处理。