用户输入的安全性是否安全?

Cli*_*int 7 html php sanitization html-entities

经过几个小时的bug搜索后,我发现了一个我最烦人的bug的原因.

当用户在我的网站上输入消息时,他们可以使用明文和html实体对其进行标题.

这意味着在某些情况下,用户将使用常见的html实体图片(如此面部)键入标题.(͡°͜ʖ͡°).

为了防止html注入,我使用htmlspecialchars(); 在标题上,令人讨厌的是,它会在以后输出到页面上时将其html实体格式转换为图片.

( ͡° ͜ʖ ͡°)
Run Code Online (Sandbox Code Playgroud)

我意识到这里的问题是标题被编码为上面的例子,而htmlspecialchar,以及做我想要的和编码可能的html注入,正在将实体中的&符号转换为

&. 
Run Code Online (Sandbox Code Playgroud)

通过取消所有的&符号,并将它们更改回&这解决了我的问题,脸部会按预期出现.

但是我不确定这是否仍然是安全的恶意HTML.解码用户推算标题中的&符号是否安全?如果没有,我该如何解决这个问题呢?

Mar*_*lin 4

如果您的实体显示为文本,那么您可能会调用htmlspecialchars()两次。

如果您没有htmlspecialchars()显式调用两次,那么如果包含表单的页面使用过时的单字节编码(如 Windows-1252),则可能会发生浏览器端自动转义。这种自动转义是正确表示特定单字节编码的字符集中不存在的字符的唯一方法。当前的所有浏览器(包括 Firefox、Opera 和 IE)都执行此操作。

确保您使用的是 Unicode(特别是 UTF-8)编码。

要使用 Unicode 作为编码,请将<meta charset="utf-8" />元素添加到HEAD包含表单的 HTML 页面部分。并且不要忘记以 UTF-8 编码保存 HTML 页面本身。要在 PHP 中使用 Unicode,通常使用多字节(mb_带前缀)字符串函数就足够了。最后,像 MySQL 这样的数据库引擎很早以前就支持 UTF-8。

作为临时解决方法,您可以通过将函数$double_encode的第四个参数 ( )设置为 来禁用对现有实体的重新编码。htmlspecialchars()false