2012-02-29 81 views
2

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

我有一些代码的麻烦类似以下内容:

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

我预计,由于值传递给警报URL编码,即点击链接时,会显示一个提示框其中值为&#039;

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

以下工作正常。

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

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

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

更好的解决方案将不胜感激。

回答

5

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

使用htmlspecialchars取得预期的效果:

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

我实实在在地感受到那种如果密被提醒有关'htmlspecialchars'。这是一天结束,我缺乏caffine。干杯。 – Leigh 2012-02-29 17:16:03

0

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

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引擎,然后JavaScript引擎必须解析  —,当然它会引发语法错误。

这个洋葱的每一层都有它自己的语法规则等等,你必须为每层的规则编码,以便当该层看到文本时看起来像什么。

0

您可以通过两种与串联分裂HTML实体:

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

他可以。但是他不会得到他想要的东西,而且这将涉及在他的来源中拥有一个无效的实体。 – 2012-02-29 17:10:30