我可以正确使用htmlspecialchars吗?

时间:2019-03-20 09:49:27

标签: javascript php html

我正在尝试从恶意代码中过滤用户的输入,以防止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命令仅用于输出吗?

3 个答案:

答案 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 &lt;b&gt;bold&lt;/b&gt; text.
</body>
</html> 

上面代码的浏览器输出将是:

This is some <b>bold</b> text.

摘要:

htmlspecialchars()函数将一些预定义的字符转换为HTML实体。

预定义字符是:

& (ampersand) becomes &amp;
" (double quote) becomes &quot;
' (single quote) becomes &#039;
< (less than) becomes &lt;
> (greater than) becomes &gt;

答案 2 :(得分:1)

.foldLeft[ErrorOr[Map[String, String]]] 编码html字符,例如htmlspecialchars将替换为<tag>。当您从数据库中加载该字符串并显示它时,浏览器仍将&lt;tag&gt;显示为&lt;tag&gt;,但浏览器不会将其视为html指令。因此,在页面源中,您仍然会看到编码后的<tag>

如果要使用页面上的字符串,以便将其解释为普通的html命令,则必须在从数据库加载内容后使用&lt;tag&gt; (Docs)将其转换回来。

htmlspecialchars_decode

如果出于安全方面的考虑,为了保护您免受SQL注入而希望转义输入,则可以改用mysqli_real_escape_string

但是使用prepared statements是最佳选择,因为您可以准确地定义期望的语句参数,并且提供的值不会弄乱它。即使只是出于测试目的,并且实施起来并不困难,这也是推荐的方法。

因此,您使用 mysqli 准备好的语句的示例为:

loaded_from_db = htmlspecialchars_decode(value);

请注意,我没有进行任何错误处理。