经过几个小时的bug搜索后,我发现了一个我最烦人的bug的原因.
当用户在我的网站上输入消息时,他们可以使用明文和html实体对其进行标题.
这意味着在某些情况下,用户将使用常见的html实体图片(如此面部)键入标题.(͡°͜ʖ͡°).
为了防止html注入,我使用htmlspecialchars(); 在标题上,令人讨厌的是,它会在以后输出到页面上时将其html实体格式转换为图片.
( ͡° ͜ʖ ͡°)
Run Code Online (Sandbox Code Playgroud)
我意识到这里的问题是标题被编码为上面的例子,而htmlspecialchar,以及做我想要的和编码可能的html注入,正在将实体中的&符号转换为
&.
Run Code Online (Sandbox Code Playgroud)
通过取消所有的&符号,并将它们更改回&这解决了我的问题,脸部会按预期出现.
但是我不确定这是否仍然是安全的恶意HTML.解码用户推算标题中的&符号是否安全?如果没有,我该如何解决这个问题呢?