【问题标题】:URL encoding of the double quote双引号的 URL 编码
【发布时间】:2014-04-12 22:57:23
【问题描述】:

我知道 url 中不允许使用双引号字符,它被编码为 %22,这是通过 utf-8 encoding 完成的。但是,如果我构建的浏览器不执行 url 编码并使用双引号本身进行查询,会发生什么,因为它在 utf-8 编码方案中是允许的。例如:www.google.com/"a"。此外,当遇到双引号时,服务器中的 url 解析脚本会发生什么?

【问题讨论】:

  • 可以用mod_rewrite处理。
  • 我看不出引号怎么会是个问题。引号被视为特殊字符的唯一原因是 URI 经常用于引号作为分隔符的环境中。 href="/%22quoted%22",诸如此类。如果我将引号输入为"%22,我看不出它们在处理方式上的差异。我不认为是浏览器在那里进行翻译。
  • 真正的特殊字符,例如/#,确实需要特别注意。
  • 这个问题的前提是有缺陷的。 %22 是 URL Escaping,与 UTF-8 无关。
  • 不管你是否构建了一个非标准的网络浏览器。像 Apache 这样的服务器会在处理它们之前对 url 进行转义(解码)。那么,如果您将熟食发送给厨师,那有什么意义呢?安全?不。你只是不遵守标准并为自己犯错误:)

标签: javascript php html


【解决方案1】:

由于您将无效的 URI 传递给服务器,服务器可能会以 HTTP 400 Bad Request 状态响应,但可能不会。不同的服务器对此有不同的行为。例如,Apache 2.4 服务器以403 Forbidden 响应。似乎他们将其视为 SQL 注入的尝试并立即将其压制。 nginx 服务器以404 Not Found 响应。

您无需构建不执行 URL 编码的浏览器即可进行检查。您可以从简单的 telnet 程序执行此查询,该程序是大多数操作系统的一部分(但默认情况下可能未安装)。如果已安装,只需在终端窗口中执行telnet www.google.com 80,粘贴以下2行:

GET /"a" HTTP/1.1
Host: www.google.com

然后按两次 Enter。您将收到404 Not Found 的回复。如果您对 stackoverflow.com 执行相同操作,则响应将是 400 Bad Request

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-17
    • 2015-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多