Javascript 我是否正确使用htmlspecialchars?

Javascript 我是否正确使用htmlspecialchars?,javascript,php,html,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=

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

是的,这是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;

是的,这是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;
htmlspecialchars的要点是删除任何HTML特殊字符,并用符号和代码替换它们,这些符号和代码将显示字符,但不会被解释为HTML。这对XSS攻击非常有效,但对SQL注入无效

这意味着,如果您通过htmlspecialchars将字符串malicousCode放入页面并将其回显,用户将看到实际的字符串。如果你不把它放到htmlspecialchars中,浏览器会认为它是一个标签,然后执行恶意代码

这本身并不能阻止SQL注入!它仅用于清理要向用户显示的字符串

为了防止SQL注入使用准备好的语句,我不鼓励您使用任何其他形式的转义,如mysqli_real_escape_string,因为使用准备好的语句完全不可能

htmlspecialchars的要点是删除任何HTML特殊字符,并用能够显示字符的符号和代码替换它们但不会被解释为HTML。这对XSS攻击非常有效,但对SQL注入无效

这意味着,如果您通过htmlspecialchars将字符串malicousCode放入页面并将其回显,用户将看到实际的字符串。如果你不把它放到htmlspecialchars中,浏览器会认为它是一个标签,然后执行恶意代码

这本身并不能阻止SQL注入!它仅用于清理要向用户显示的字符串

为了防止SQL注入使用准备好的语句,我不鼓励您使用任何其他形式的转义,如mysqli_real_escape_string,因为使用准备好的语句完全不可能

htmlspecialchars编码html字符,例如将被标记替换。当您从数据库加载该字符串并显示它时,浏览器仍将标记显示为,但浏览器不会将其视为html指令。因此,在页面源代码中,您仍然可以看到编码的标记

如果要在页面上使用字符串,以便将其解释为普通html命令,则必须在从数据库加载内容后使用htmlspecialchars_decode将其转换回

loaded_from_db = htmlspecialchars_decode(value);
如果出于安全考虑而希望转义输入以防止sql注入,则可以使用

但是使用将是最好的选择,因为您准确地定义了您期望作为语句参数的内容,并且提供的值不会弄乱它。这也是推荐的方法,即使它只是为了测试目的,而且实现起来并不困难

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

$stmt = $mysqli->prepare("UPDATE playerstats SET message=? WHERE id = ?");    
$stmt->bind_param("si", $post, $id)
$stmt->execute()
请注意,我没有包含任何错误处理。

htmlspecialchars编码html字符,例如,将替换为标记。当您从数据库加载该字符串并显示它时,浏览器仍将标记显示为,但浏览器不会将其视为html指令。因此,在页面源代码中,您仍然可以看到编码的标记

如果要在页面上使用字符串,以便将其解释为普通html命令,则必须在从数据库加载内容后使用htmlspecialchars_decode将其转换回

loaded_from_db = htmlspecialchars_decode(value);
如果出于安全考虑而希望转义输入以防止sql注入,则可以使用

但是使用将是最好的选择,因为您准确地定义了您期望作为语句参数的内容,并且提供的值不会弄乱它。这也是推荐的方法 即使它只是为了测试目的,而且实现起来并不困难

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

$stmt = $mysqli->prepare("UPDATE playerstats SET message=? WHERE id = ?");    
$stmt->bind_param("si", $post, $id)
$stmt->execute()

请注意,我没有包含任何错误处理。

我不完全确定我是否理解该问题。如果你真的在HTML页面上看到了这些字符——你应该看到——那么htmlspecialchars已经完成了它的工作。如果你没有这样做,你不会看到任何东西,你只会让脚本实际执行。在这种情况下,通过重定向您。这就是我看到的。我想我不应该以这种方式看到代码?图片上的消息页面显示已发布到数据库中的帖子。在数据库htmlspecialchars中,我的问题是为什么我在浏览器中再次看到SpecialChars。很抱歉,我不擅长解释。在将数据存储到数据库之前,应避免转义数据。您应该将其保存为原样,如果使用参数化,这不是问题。应在使用数据之前进行转义。若要在HTML页面上输出,请使用htmlspecialchars或htmlentities。如果你想用它来做别的事情,你可能需要用不同的方式来逃避它。我不完全确定我是否理解这个问题。如果你真的在HTML页面上看到了这些字符——你应该看到——那么htmlspecialchars已经完成了它的工作。如果你没有这样做,你不会看到任何东西,你只会让脚本实际执行。在这种情况下,通过重定向您。这就是我看到的。我想我不应该以这种方式看到代码?图片上的消息页面显示已发布到数据库中的帖子。在数据库htmlspecialchars中,我的问题是为什么我在浏览器中再次看到SpecialChars。很抱歉,我不擅长解释。在将数据存储到数据库之前,应避免转义数据。您应该将其保存为原样,如果使用参数化,这不是问题。应在使用数据之前进行转义。若要在HTML页面上输出,请使用htmlspecialchars或htmlentities。如果你想用它来做其他事情,你可能需要用不同的方式来逃避它。因为使用预先准备好的语句会使它完全不可能——而不是完全正确。有些地方你仍然容易受到攻击,所以“完全不可能”的说法有点过于绝对。我认为你混淆了两个不同的安全问题。你是对的,htmlspecialchars没有阻止SQL注入。正如你所说的那样,你要使用事先准备好的陈述。htmlspecialchars可以防止跨站点脚本XSS攻击。是的,最终htmlspecialchars也可以防止XSS,但它不是唯一的功能。您还可以使用它来显示包含特殊html字符的普通用户输入文本,在我看来,阻止XSS更像是隐含的功能,但我也会将其添加到答案中。因为使用预先准备好的语句使其完全不可能实现,而不是完全正确。有些地方你仍然容易受到攻击,所以“完全不可能”的说法有点过于绝对。我认为你混淆了两个不同的安全问题。你是对的,htmlspecialchars没有阻止SQL注入。正如你所说的那样,你要使用事先准备好的陈述。htmlspecialchars可以防止跨站点脚本XSS攻击。是的,最终htmlspecialchars也可以防止XSS,但它不是唯一的功能。您还可以使用它显示包含特殊html字符的普通用户输入文本,在我看来,阻止XSS更像是隐含的功能,但我也会将其添加到答案中。不要推荐mysqli_real_escape_string。准备好的声明才是出路。此外,mysqli_real_escape_字符串仅适用于mysqli,而不适用于PDO。不过,两人都支持事先准备好的声明。谢谢。困扰我的是,我看到的代码没有在浏览器输出中编码。这是因为标记仍然显示为html标记,但只是没有被解释为html标记。@BlackSunPhoenixEntertainmen-编码数据的目的是能够在不被浏览器解释为html的情况下输出所写的字符串。因此,如果你检查页面源代码,你会看到编码字符串,而浏览器会在视图中输出真实字符。是的,兄弟,我刚刚意识到,当我用解码代码替换编码代码时。浏览器开始在同一页面上无限次重定向我。谢谢你的帮助!不要推荐mysqli\u real\u escape\u字符串。准备好的声明才是出路。此外,mysqli_real_escape_字符串仅适用于mysqli,而不适用于PDO。不过,两人都支持事先准备好的声明。谢谢。困扰我的是,我看到的代码没有在浏览器输出中编码。这是因为标记仍然显示为html标记,但只是没有被解释为html标记。@BlackSunPhoenixEntertainmen-编码数据的目的是能够在不被浏览器解释为html的情况下输出所写的字符串。所以如果
你检查页面源代码,你会看到编码字符串,而浏览器会在视图中输出真实字符。是的,兄弟,我刚刚意识到,当我用解码代码替换编码代码时。浏览器开始在同一页面上无限次重定向我。谢谢你的帮助!