是否内联HTML js事件不关心转义引号?
$xss = addslashes("'><script>alert(/XSS/.source)</script>");
echo "<a href='/deleteaction.php' onclick='javascript:if(!confirm(\"{$xss}\")) return false'>Delete</a>";
制作HTML:
<a href='/deleteaction.php' onclick='javascript:if(!confirm("\'>
<script>alert(/XSS/.source)</script>
")) return false'>Delete</a>
编辑:所以这实际上是执行脚本。我以为它会在确认框中产生这样的字符串:
'><script>alert(/XSS/.source)</script>
但是,第一个单引号被解释为onclick事件的结束引用。所以我的问题是,为什么它被解释为结束引用,尽管它之前有反斜杠?
答案 0 :(得分:1)
这是因为浏览器的HTML解析器在JavaScript解析器之前运行。
在HTML中\'
不被识别为单引号字符,它被识别为字面上的反斜杠后跟单引号。
单引号的正确HTML为'
(或十进制'
。
要解决此问题,您应该使用htmlentities
以及addslashes
。
e.g。
$xss = addslashes(htmlentities("'><script>alert(/XSS/.source)</script>", ENT_QUOTES));
这将输出:
<a href='/deleteaction.php' onclick='javascript:if(!confirm("'><script>alert(/XSS/.source)</script>")) return false'>Delete</a>
确认的正确编码是:
请注意,这仅适用于可包含脚本的HTML属性,而不适用于<script>
标记内的内容,因为该内容不是通过HTML解析器运行的(HTML解析器只查找最终的</script>
直到它恢复HTML处理。)
注意,如果字符串包含addslashes
个字符,我们也需要\
。
一种不那么混乱的编码方式是遵循Rule #3 of the OWASP XSS (Cross Site Scripting) Prevention Cheat Sheet:
除字母数字字符外,请将所有字符转义为小于 256用\ xHH格式防止切换出数据值 进入脚本上下文或另一个属性。
因此,我们只是JavaScript十六进制实体编码,而不是对斜杠和HTML进行编码。据我所知,PHP不提供开箱即用的功能(如果我错了,请纠正我。)
这也处理了属性是单引号,双引号或不引用的情况(因为空格转换为\x20
)。
答案 1 :(得分:0)
这是正确的$ xss值。你最后错过了一个单引号。
$xss = addslashes("'><script>alert(/XSS/.source)</script>'");
已编辑
我们不能直接使用&lt;和&gt;我们的代码中的标签,因为它们是为html标签保留的标准html标签,而是使用html实体
$xss = addslashes("'><script>alert(/XSS/.source)</script>'");
我希望这会对你有所帮助。
答案 2 :(得分:0)
我从http://www.jibbering.com/faq/faq_notes/script_tags.html
找到答案事件处理属性的值几乎肯定需要 被引用是因为写一个javascript几乎是不可能的 仅使用未加引号中允许的字符的语句 属性值。引用可以完全涉及属性 值因为它们需要在HTML源代码中引用,所以无论如何 HTML中使用的引号标记类型不能在其中使用 javascript代码作为值提供,因为HTML解析器会 将它们作为结束属性值的字符串。而 javascript字符串文字允许使用双引号或单引号 引号为分隔符,并允许引用的类型不用作 分隔符出现在未转义的字符串文字中。
所以,鉴于希望分配字符串&#34;不要这样做&#34;到了 元素在onclick事件中的value属性,因为单个 引号出现在字符串本身的属性值中 onclick =&#39; this.value =&#34;不要这样做&#34;;&#39;因为HTML不会起作用 解析器将第二个单引号作为结束属性 值。简单地将单引号转义为 onclick =&#39; this.value =&#34;不要这样做&#34;;&#39;因为HTML解析器 我不知道有关javascript转义的任何信息,仍然可以看到 javascript字符串中间的第二个单引号。
在这种情况下,转出单引号并反转引用 在HTML和javascript之间onclick =&#34; this.value =&#39;不做 该&#39 ;;&#34;或者使用javascript十六进制转义符(HTML解析器将使用) 不要看作是一个引用)onclick =&#39; this.value =&#34;不要这样做&#34;;&#39;将 解决这个问题。但事件处理属性字符串中的引号 通常需要考虑定义使用字符串文字的代码。