在 URL 查询字符串中使用方括号的数组语法是否有效?

2024-03-10

在 URL 查询字符串中使用多维数组语法实际上安全/有效吗?

http://example.com?abc[]=123&abc[]=456

它似乎适用于每个浏览器,我一直认为它可以使用,但根据本文中的评论,事实并非如此:http://www.456bereastreet.com/archive/201008/what_characters_are_allowed_unencoded_in_query_strings/#comment4 http://www.456bereastreet.com/archive/201008/what_characters_are_allowed_unencoded_in_query_strings/#comment4

我想听听第二个意见。


答案并不简单。

以下内容摘自 RFC 3986 的第 3.2.2 节:

由 Internet 协议文字地址(版本 6)标识的主机
[RFC3513] 或更高版本,通过括起 IP 文字来区分
在方括号(“[”和“]”)内。这是唯一的地方
URI 语法中允许使用方括号字符。

This seems通过断然声明 URI 中的其他任何地方都不允许使用方括号来回答这个问题。但方括号字符和百分号编码的方括号字符之间存在差异。

以下内容摘自 RFC 3986 第 3 节的开头:

  1. 语法组件

通用 URI 语法由以下层次结构序列组成
称为方案、权限、路径、查询和的组件
分段。

  URI         = scheme ":" hier-part [ "?" query ] [ "#" fragment ]

所以“查询”是“URI”的一个组成部分。

以下内容摘自 RFC 3986 的 2.2 节:

2.2.保留字符

URI 包括由以下分隔的组件和子组件
“保留”集中的字符。这些字符被称为
“保留”,因为它们可能(或可能不)被定义为分隔符
通用语法,通过每个特定于方案的语法,或通过
URI 解除引用算法的特定于实现的语法。
如果 URI 组件的数据与保留的数据冲突
字符的用途作为分隔符,那么冲突的数据必须
在形成 URI 之前进行百分比编码。

  reserved    = gen-delims / sub-delims

  gen-delims  = ":" / "/" / "?" / "#" / "[" / "]" / "@"

  sub-delims  = "!" / "$" / "&" / "'" / "(" / ")"
              / "*" / "+" / "," / ";" / "="

因此,方括号可能会出现在查询字符串中,但前提是它们是百分比编码的。除非不是,否则将在 2.2 节中进一步解释:

生成 URI 的应用程序应对数据八位字节进行百分比编码
对应于保留集中的字符,除非这些字符
URI 方案特别允许表示其中的数据
成分。如果在 URI 组件中找到保留字符并且
该字符没有已知的分隔角色,那么它一定是
解释为表示对应的数据八位字节
US-ASCII 中的字符编码。

因此,由于方括号仅允许在“主机”子组件中使用,因此它们“应该”在其他组件和子组件中进行百分比编码,在本例中是在“查询”组件中,除非 RFC 3986 明确允许未编码的方括号表示中的数据查询组件,但它没有。

但是,如果“生成 URI 的应用程序”未能执行其“应该”执行的操作(在查询中保留方括号未编码),则 URI 的读者不会直接拒绝该 URI。相反,方括号将被视为属于查询组件的数据,因为它们不用作该组件中的分隔符。

这就是为什么,例如,当 PHP 接受未编码和百分比编码的方括号作为查询字符串中的有效字符,甚至为它们分配特殊用途时,并不违反 RFC 3986。然而,试图利用此漏洞而不对方括号进行百分比编码的作者似乎违反了 RFC 3986。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 URL 查询字符串中使用方括号的数组语法是否有效? 的相关文章

  • 在Javascript中查找多维数组的索引

    我在 JavaScript 中创建了一个多维数组 我想找到特定值的确切索引 该值将是用户输入 var array var k 0 for var i 0 i lt 10 i array i for var j 0 j lt 100 j k
  • SharePoint 发布 HTML 字段控件将相对 URL 转换为绝对 URL

    因此 在对是否应该在面向外部的 SharePoint 网站上使用 CEWP 还是 HTML 字段控件进行了大量研究之后 我们决定使用字段控件 非常感谢 AC 现在 我们遇到了一个问题 我读过的所有博客都说这不应该是一个问题 当我们将相对 U
  • 正则表达式:验证没有查询参数的 URL 路径

    我不是正则表达式专家 我正在绞尽脑汁尝试做一个看起来非常简单并且在 python 2 7 中工作的事情 在没有查询字符串的情况下验证 URL 的路径 无主机名 换句话说 以 开头的字符串允许字母数字值 并且不允许任何其他特殊字符 除了这些
  • 获取完整的 url,包括哈希后的查询字符串

    如何获得完整URL包括后面的字符串参数hash tag 我试着回应 url SERVER REQUEST URI echo url 之后的字符串hash tag不会读 佩卡的评论应该是一个答案 hash标签后面的字符串参数不发送到服务器 它
  • 当url中有空格时htaccess重定向

    我想从仍然出现在谷歌搜索中的旧网址重定向到新网址 旧的网址是这样的 http www marionettecolla org file 20 mostra milano mostra marionette milano htm 我想将其重定
  • PHP - 根据一个值查找具有不同结构的两个多维数组之间的差异

    我正在努力理解哪种数组函数最适合我的特定情况 其他人似乎有很多困惑 我也读过几篇文章 我有两个具有不同结构的数组 但都包含一个我想比较的 ID 字段 数组一是我的素材数组 它看起来像 array 1 0 gt array 5 ID gt s
  • PHP 按值对数组进行分组

    我有一个像这样的数组 Array 0 gt ing 1 ing 1 gt ing 1 amount 2 gt ing 1 det 3 gt ing 1 meas 4 gt ing 2 ing 5 gt ing 2 amount 6 gt i
  • spring 类路径资源中的相对路径

    我有一堆 spring 配置文件 所有这些文件都位于各个子包的 META INF 目录下 我一直在使用如下所示的导入
  • 地址栏中的 https 锁和公司名称

    我注意到在查看贝宝的网站时 他们的公司名称位于 Chrome 中的锁定图标旁边 这是因为他们创作了 ssl 证书 还是您认为他们是如何实现这一目标的 这是我一直很好奇的事情 但在搜索过程中我很难找到任何答案 您需要一个称为 扩展验证 EV
  • 阿拉伯语查询字符串问题(???在值中)

    我在查询字符串中发送一个阿拉伯语值 当在服务器上检索它时 该值是错误的并被引号替换 例如 http server mypage aspx qs mortgage http server mypage aspx qs D9 85 D8 B1
  • 如何在 Django 中获取 URL(带有协议和域)(无需请求)?

    我想在 cron 作业中发送邮件 邮件应包含 我的应用程序的链接 在 cron 作业中 我没有请求对象 并且无法使用 request build absolute uri 据我所知 网站框架可以在这里提供帮助 但没有给我协议 http vs
  • 如何使用 np.newaxis?

    What is numpy newaxis https numpy org doc stable reference constants html numpy newaxis我什么时候应该使用它 在一维数组上使用它x产生 gt gt gt
  • Zend url:获取参数始终保留在 url 中

    我在使用带有 get 参数的 Zend url 帮助器时遇到一些问题 在一个视图中 我有分页 它在 get 中发送额外的参数 所以在 url 中 所以没关系 但这是不行的 即使我更改页面 参数也始终保留在 url 中 事实上 zend ur
  • 一个在 Java 中进行 URL 查询字符串操作的好库 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我需要用 Java 进行一些非常简单的 URL 操作 就像获取查询中参数的值或更新它一样 我希望在 commons lang 包中找到一个
  • 从Python中的URL中提取域[重复]

    这个问题在这里已经有答案了 我有一个像这样的网址 http abc hostname com somethings anything 我想得到 hostname com 我可以使用什么模块来完成此任务 我想在python2中使用相同的模块和
  • Request.Url.Query 和 Request.QueryString 有什么区别?

    我一直在追踪 URL 重写应用程序上的错误 该错误表现为查询字符串中某些变音符号的编码问题 基本上 问题是基本上 search aspx search he m nek 的请求被 search he c5 99m c3 a1nek 的查询字
  • 本地主机:8080 是什么意思? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 有什么区别本地主机 网络 vs 本地主机 8080 web TCP IP 连接始终与 IP 地址建立 您可以将 IP 地址视为某台计算机的
  • PHP 中的 Javascript“unes​​cape”

    我的图像主机有一个 Google Chrome 扩展程序 它会向我的网站发送一个 URL 该网址得到encoded通过 JavaScript 的escape method 编码的 URLescape看起来像这样 http 253A 4 bp
  • C memcpy 二维数组

    我正在尝试使用将一个二维数组复制到另一个memcpy 我的代码 include
  • 为什么 Django 的 URLField 默认截断为 200 个字符?

    我喜欢 Django 并且经常使用它 我发现它的大部分默认设置都是正常的 但有一个一直困扰着我 以至于我在每个项目中都覆盖了它 a 的默认最大长度URLField https github com django django blob st

随机推荐