首先让我说Javascript不是我的强项,我为此主题的信息所做的所有搜索都导致了如何处理url编码/解码字符串。
我遇到类似以下代码的问题:
<a href="#" onclick="<?php echo "alert(''');"; ?>">test</>
我希望由于传递给alert的值是url编码的,因此当点击该链接时,会显示一个警告框,其中包含值'
。
事实证明,因为它位于onclick的引号之间,所以浏览器在执行之前将'解码'为单引号。基本上导致代码alert(''');
明显突然崩溃。
以下工作正常。
<script>alert(''');</script>
首先,有没有办法禁用这种行为,或者是一种聪明的解决方法? (我猜不是)
我目前的解决方案是解码html编码的字符串,将斜杠应用于引号,然后重新编码。显然不是很优雅。
非常感谢更好的解决方案。
答案 0 :(得分:5)
这是预期的行为。当浏览器分析属性时,HTML源代码中的HTML实体会自动转换。这允许网站开发人员在不破坏页面的情况下包含特殊字符,例如属性中的引号。
使用htmlspecialchars
获得所需效果:
<a href="#" onclick="<?php echo htmlspecialchars("alert(''');"); ?>">test</a>
答案 1 :(得分:2)
不,你必须做你所描述的,并且有充分的理由:这是洋葱层的事情。
鉴于你特别的洋葱:
<a href="#" onclick="<?php echo "alert(''');"; ?>">test</>
第一层是PHP,完成后会将其发送到浏览器:
<a href="#" onclick="alert(''');">test</>
下一层是浏览器的HTML解析器,它负责各种事情,包括创建DOM元素(和其他类型的节点)和处理字符实体。所以HTML解析器在内存中创建了一个a
元素:
+------------------------+ | a | +------------------------+ | href: "#" | | onclick: "alert(''');" | | | +------------------------+
下一层是JavaScript执行。当用户单击该a
元素时,浏览器会将JavaScript引擎传递给onclick
属性所包含的字符串,然后JavaScript引擎必须解析该字符串 - 当然,它会引发语法错误。
这个洋葱的每一层都有自己的语法规则等等,你必须编写每个图层的规则,以及当该图层看到文本时的样子。
答案 2 :(得分:0)
这是因为'
在HTML属性中被解码。这是您不应将JavaScript内联到HTML中的一个原因。
答案 3 :(得分:0)
您可以使用串联将HTML实体拆分为两个:
<a href="#" onclick="alert('&#'+'039;');">test</a>