【问题标题】:decodeURIComponent fails from URI provided from form submit to chrome.webRequestdecodeURIComponent 从表单提交到 chrome.webRequest 提供的 URI 失败
【发布时间】:2017-02-04 22:29:00
【问题描述】:

我有以下情况。

  • 我通过 HTML 表单执行 GET 请求
    • 我有一个文本字段,该字段的内容为<< BLAH >alert (”BLAH”);//<</ blah >。已知它是无效的假设标记。
  • 我在webRequest 上有一个事件监听器
  • 我尝试在 webrequest 的完整 url 上 decodeURIComponent,由表单提交触发
  • 解码失败,出乎意料。
    • 我希望 decodeURIComponent 应该能够解码浏览器从表单中编码的任何内容。这似乎是一个错误的假设,或者 chrome: 55.0.x* 中的一个错误

如果下面的 JS 在 chrome 扩展中,下面的 sn-p 将证明这个问题。

var filter =  { urls: ['<all_urls>'] }

function handler (details) {
  decodeURIComponent(details.url)
}
chrome.webRequest.onBeforeRequest.addListener(
  handler,
  filter,
  ['blocking', 'requestBody']
)
<form method='get'>
  <input type='text' name='field'/>
  <button type='submit'>submit</button>
</form>

当然你不能实际运行这个——webRequest 是 chrome 扩展 API 的一部分。

寻找提示。谢谢!

【问题讨论】:

  • edit 成为主题的问题:包括一个完整 minimal reproducible example 重复问题。包括一个manifest.json,一些背景/内容/弹出脚本/HTML。寻求调试帮助的问题(“为什么这段代码不工作?”)必须包括:►期望的行为,►特定问题或错误►必要的最短代码重现它在问题本身。没有明确问题陈述的问题对其他读者没有用处。请参阅:“如何创建 minimal reproducible example”、What topics can I ask about here?How to Ask
  • 当您加载并执行您的扩展程序时,various appropriate consoles for your extension 中显示的究竟是什么?请提供准确输入、失败输出和预期输出。
  • 您正在尝试解码整个 URI。通常你会使用:decodeURI(),但使用decodeURIComponent() 不会导致它失败。
  • 它实际上工作似乎依赖于提交表单的网页上的其他一些特征。我只是模拟了一个解码工作的本地示例,但在这里仍然失败:testingground.nowebscale.com。即 => 扩展解码 URI 在我的本地表单上成功,但不是在他们的表单上。我需要做进一步的调查。因为我不能提供一个可重复的例子......我的例子是成功的!但扩展确实在其他地方失败。我仍然可以捆绑扩展并共享
  • minimal reproducible example 的要点和调试问题所需的信息是我们有足够的能力来复制问题。请edit在问题中提供更多信息,以便我们可以复制问题。如果您能获得并提供给我们decodeURIComponent 有问题的字符串,而不是必须向我们提供我们需要执行提交以触发webRequest 的URL,那将是最好的。

标签: javascript google-chrome-extension decodeuricomponent


【解决方案1】:

这是由大引号引起的。 Chrome 不会代表您重新映射任何字符以使 URI 友好。那是'”' !== '"',我的表单字段使用的是 ==> %94。奇怪的是,引擎盖下的表单不使用encodeURIComponent('”') ==&gt; %E2%80%9D。不管怎样,decodeURIComponent('%94') 炸了。

【讨论】:

  • 谁将编码为%94?这不是有效的百分比编码值。
  • 铬。 HTML 表单。
  • 那么目标请求确实有这个%94BLAH%94 吗?还是仅在onBeforeRequest 的事件处理程序.details 中?在我的 chrome 上,它按预期使用 %E2%80%9DBLAH%E2%80%9D 执行请求。另外,这是哪个版本的chrome?
  • 啊,我知道了,您的页面将其charset 设置为ISO Latin 或类似的权利吗?此字符集中不支持,因此使用替换字符代替,该字符不能进行URI 编码。将您的字符集设置为utf8,一切都应该很好。
  • edit your Question,以便可以从您的问题内容中确定这是一个有效的答案。这意味着您需要向您的问题添加其他信息才能获得完整的minimal reproducible example(即提供实际使用的 HTML)。有了这些信息,这将是一个有趣的问题,可能对未来的读者有用,并可能获得一些支持。
【解决方案2】:

当我尝试使用 decodeURIComponent 解码字符串时,我在 Google Chrome 中遇到了 URI malformed 错误。它在该字符串中的 % 字符上失败,我不希望对该字符串的有效性进行任何检查。所以我最终使用了unescape intsead 方法:unescape(mystring)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-03
    • 1970-01-01
    • 2014-10-30
    • 2016-03-01
    相关资源
    最近更新 更多