防止Javascript解码编码的HTML

时间:2012-02-29 16:59:02

标签: php javascript

首先让我说Javascript不是我的强项,我为此主题的信息所做的所有搜索都导致了如何处理url编码/解码字符串。

我遇到类似以下代码的问题:

<a href="#" onclick="<?php echo "alert('&#039;');"; ?>">test</>

我希望由于传递给alert的值是url编码的,因此当点击该链接时,会显示一个警告框,其中包含值&#039;

事实证明,因为它位于onclick的引号之间,所以浏览器在执行之前将'解码'为单引号。基本上导致代码alert(''');明显突然崩溃。

以下工作正常。

<script>alert('&#039;');</script>

首先,有没有办法禁用这种行为,或者是一种聪明的解决方法? (我猜不是)

我目前的解决方案是解码html编码的字符串,将斜杠应用于引号,然后重新编码。显然不是很优雅。

非常感谢更好的解决方案。

4 个答案:

答案 0 :(得分:5)

这是预期的行为。当浏览器分析属性时,HTML源代码中的HTML实体会自动转换。这允许网站开发人员在不破坏页面的情况下包含特殊字符,例如属性中的引号。

使用htmlspecialchars获得所需效果:

<a href="#" onclick="<?php echo htmlspecialchars("alert('&#039;');"); ?>">test</a>

答案 1 :(得分:2)

不,你必须做你所描述的,并且有充分的理由:这是洋葱层的事情。

鉴于你特别的洋葱:

<a href="#" onclick="<?php echo "alert('&#039;');"; ?>">test</>

第一层是PHP,完成后会将其发送到浏览器:

<a href="#" onclick="alert('&#039;');">test</>

下一层是浏览器的HTML解析器,它负责各种事情,包括创建DOM元素(和其他类型的节点)和处理字符实体。所以HTML解析器在内存中创建了一个a元素:

+------------------------+
| a                      |
+------------------------+
| href: "#"              |
| onclick: "alert(''');" |
|                        |
+------------------------+

下一层是JavaScript执行。当用户单击该a元素时,浏览器会将JavaScript引擎传递给onclick属性所包含的字符串,然后JavaScript引擎必须解析该字符串 - 当然,它会引发语法错误。

这个洋葱的每一层都有自己的语法规则等等,你必须编写每个图层的规则,以及当该图层看到文本时的样子。

答案 2 :(得分:0)

这是因为&#039;在HTML属性中被解码。这是您不应将JavaScript内联到HTML中的一个原因。

答案 3 :(得分:0)

您可以使用串联将HT​​ML实体拆分为两个:

<a href="#" onclick="alert('&#'+'039;');">test</a>​