gpt4 book ai didi

javascript - window.open UTF-8 问题

转载 作者:行者123 更新时间:2023-11-29 14:45:44 25 4
gpt4 key购买 nike

我有这个网站:

http://a.b/x – y

在 UTF-8 语言中破折号是非 ASCII\u2013 或 %E2%80%93。

以下使用 UTF-8 的链接工作正常:

<a href="http://a.b/x%20%E2%80%93%20y" target="_blank">True Link</a>

但是使用具有完全相同 URL 的 window.open() 编写脚本会给出 404:

<a href="javascript:void(window.open( 'http://a.b/x%20%E2%80%93%20y','_blank','top=10,left=10,height=900,width=1500,resizable=yes'))">Raw JS Link</a>

查看错误页面上的属性以查看生成的 URL 我注意到扩展破折号被替换为: ??

如果我替换扩展破折号,并且只有扩展破折号为“\u2013”​​,链接工作正常:

<a href="javascript:void(window.open( 'http://a.b/x%20\u2013%20y','_blank','top=10,left=10,height=900,width=1500,resizable=yes'))">Modified JS Link</a>

并且生成的 URL 似乎已将扩展破折号重新编码回 UTF-8。

考虑到这一点,我尝试解码 UTF-8 编码并仅重新编码空格,但失败并出现与之前相同的错误:

<a href="javascript:void(window.open( decodeURIComponent('http://a.b/x%20%E2%80%93%20y').split(' ').join('%20'),'_blank','top=10,left=10,height=900,width=1500,resizable=yes'))">Raw JS Link</a>

我怀疑 window.open() 出于某种原因正在破坏 URL。

然后我继续尝试一堆不同的想法和解码/编码的组合,甚至将 escpae()/unescape() 重新投入使用,但无济于事。

window.open 的原因是我只能控制 HREF 属性的内容。在这种情况下,它是“转到 URL”操作中的 SSRS 表达式,SSRS UTF-8 对某些字符进行编码,因此即使使用上面的 split(' ') 我实际上也必须使用 split(String.fromCharCode(32)) .但是,我已将所有内容剥离到一个简单的 HTML 页面中,这是我进行分析的地方。

PS:IE8,虽然用户群是 IE8+PSS:添加了遗漏的报价。PSS:看起来这可能是 IE8 特有的问题。

最佳答案

<a href="javascript:void(window.open('http://a.b/...component...

所以这里有多个嵌套的转义上下文。您正在将文本注入(inject):

  • 一个 URL 的组成部分(需要 URL 转义),在里面
  • 一个 JavaScript 字符串文字(需要 JS 转义),在里面
  • 一个 javascript:伪 URL(需要 URL 转义),在里面
  • 一个 HTML 属性值(需要 HTML 转义)

因此值 x – y 必须转义四次:

  1. URL 转义为 x%20%E2%80%93%20y
  2. JS-escape to x%20%E2%80%93%20y(这次没有变化,因为这个值中没有 JS-special 字符)
  3. URL 转义为 x%2520%25E2%2580%2593%2520y
  4. HTML 转义为 x%2520%25E2%2580%2593%2520y(这次没有更改,因为此值中没有 HTML 特殊字符)。

需要转义的嵌套语法非常非常难以正确处理。通常,您永远不应该使用 javascript: URL:它们不仅是多重转义的噩梦,而且对可用性和可访问性也非常不利。

避免注入(inject)嵌套代码。对于在新窗口中打开的链接(如果你绝对必须),一个更好的模式是将真实的 URL 放在 href 中,这样它就能正确响应中键点击和其他链接功能,然后阅读来自 JS 的 href,例如:

<a href="http://a.b/x%20%E2%80%93%20y" onclick="window.open(this.href, ...options...); return false;"

(return-false 防止链接在窗口打开后被跟踪。)还可以考虑将 JS 代码分解成一个单独的脚本,自动绑定(bind)到所有适当的链接(例如,通过 class 属性) 因此您不必在 HTML 中包含内联 JavaScript。

关于javascript - window.open UTF-8 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33137955/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com