HTTP 查询字符串中哪些字符必须转义?

2023-12-23

此问题涉及 URL 查询字符串部分中的字符,这些字符出现在?标记字符。

Per 维基百科 http://en.wikipedia.org/wiki/Query_string,某些字符保留原样,而其他字符则进行编码(通常使用%转义序列)。

我一直在尝试将其追溯到实际规范,以便我了解维基百科页面中每个要点背后的理由。

矛盾例1:

The HTML规范 http://www.w3.org/TR/REC-html40/interact/forms.html#form-content-type说将空间编码为+并将其余的推迟到RFC1738 http://www.ietf.org/rfc/rfc1738.txt。然而,这个 RFC 说~是不安全的,而且“所有不安全字符必须始终在 URL 中进行编码”。这似乎与维基百科相矛盾。

实际上,IE8 编码~在它生成的查询字符串中,而 FF3 保持原样。

矛盾例2:

维基百科指出,它未提及的所有字符都必须进行编码。!维基百科中没有提及。但RFC1738 http://www.ietf.org/rfc/rfc1738.txt指出!是一个“特殊”字符并且“可以不编码地使用”。这似乎与维基百科所说的必须进行编码相矛盾。

实际上,IE8 编码!在它生成的查询字符串中,而 FF3 保持原样。

我知道这样做的寓意可能是对维基百科和规范之间有疑问的那些字符进行编码。甚至可能对除 [A-Za-z0-9] 之外的所有内容进行编码。我只是想知道这方面的实际标准。

结论

维基百科上描述的算法精确地编码了那些不是的字符RFC3986 非保留字符 https://www.rfc-editor.org/rfc/rfc3986#section-2.3。也就是说,它对除字母数字之外的所有字符进行编码-._~。作为一种特殊情况,空间被编码为+代替%20根据 RFC3986。

某些应用程序使用较旧的 RFC。为了比较,将RFC2396 非保留字符 https://www.rfc-editor.org/rfc/rfc2396#page-9是字母数字和!'()*-._~.

为了比较,将HTML5算法工作草案 http://dev.w3.org/html5/spec/Overview.html#application-x-www-form-urlencoded-encoding-algorithm对除字母数字之外的所有字符进行编码*-._。空间的特殊情况编码仍然存在+。显着的差异是*未编码并且~被编码。 (从技术上讲,这种处理*与 RFC3986 兼容,尽管* is in reserved因为它是在sub-delims哪些是允许的query生产。)


答案就在 RFC 3986 文档中,具体来说第 3.4 节 https://www.rfc-editor.org/rfc/rfc3986#section-3.4.

查询部分由第一个问题表示 标记(“?”)字符并以数字符号(“#”)字符终止 或者在 URI 的末尾。

...

字符斜杠(“/”)和问号(“?”)可以代表数据 在查询组件内。

从技术上来说,RFC 3986-3.4 https://www.rfc-editor.org/rfc/rfc3986#section-3.4将查询组件定义为:

query       = *( pchar / "/" / "?" )

此语法意味着查询可以包含以下位置的所有字符pchar/ and ?. pchar指的是路径字符的另一种规范。有帮助的是,附录A https://www.rfc-editor.org/rfc/rfc3986#appendix-ARFC 3986 列出了相关的 ABNF 定义,最值得注意的是:

query         = *( pchar / "/" / "?" )
pchar         = unreserved / pct-encoded / sub-delims / ":" / "@"
unreserved    = ALPHA / DIGIT / "-" / "." / "_" / "~"
pct-encoded   = "%" HEXDIG HEXDIG
sub-delims    = "!" / "$" / "&" / "'" / "(" / ")" / "*" / "+" / "," / ";" / "="

因此,除了所有字母数字和百分比编码字符,查询可以合法地包含以下未编码字符:

/ ? : @ - . _ ~ ! $ & ' ( ) * + , ; =

当然,您可能需要记住“=”和“&”通常在查询中具有特殊意义。

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

HTTP 查询字符串中哪些字符必须转义? 的相关文章

随机推荐

  • 如何创建带有内阴影的圆形 UITextField

    我正在定制一个UITextfield看起来像UISearchbar 我做类似的事情 self back textfield UITextField alloc initWithFrame CGRectMake 5 7 310 30 self
  • 如何让.net HttpClient使用http 2.0?

    我有一个托管在 IIS 10 windows server 2016 上的 asp net Web api 当我做一个GET从 Microsoft Edge 浏览器请求此内容 我看到HTTP 2 0用于 IIS 日志 2015 09 20
  • QlikView - 使用变量设置分析表达式

    我有变量 varCurrentYear varCurrentYear Year Today 我写了这个集合分析表达式 结果不正确 顺便说一下如果变量是这样声明的 varCurrentYear 2014 结果是正确的 为什么 谢谢 I d u
  • Helm stable/airflow - 使用 Helm 图表失败时使用共享持久卷进行 Airflow 部署的自定义值

    客观的 我想在 Kubernetes 上部署 Airflow 其中 Pod 可以访问共享持久卷中的相同 DAG 根据文档 https github com helm charts tree master stable airflow usi
  • 购物车中的产品重复

    我的购物车功能有一个简单的问题 当我点击 添加到购物车 按钮后 如果它具有相同的产品 ID 它会在新行中输出一个新产品 如果产品 ID 相同 则只需增加产品的数量即可 const products const carts const inp
  • iOS UITabBar:删除顶部阴影渐变线

    我实现了一个自定义 UITabBar 并且它上面仍然有这个渐变 阴影 我添加了 self tabBar setBackgroundImage UIImage imageNamed navBarBottom png 这只是改变背景但保持阴影渐
  • 如何结合angularjs和xhtml?

    这是 AngularJS 的一个最小示例 保存为时可以工作angular html p Nothing here yet p 不过 我坚信 XML 并且
  • OCaml 编译器检查向量长度

    我想知道是否可以在 OCaml 中进行编译时检查以确保数组的长度正确 对于我的问题 我想在进行分段向量减法之前验证两个 GPU 1 dim 向量的长度相同 let init value 1 let length 10 000 000 let
  • Rails:对 before_create 进行单元测试?

    我正在尝试测试回调是否正确生成了一个字段 但我无法弄清楚这一点 album rb before create generate permalink private def generate permalink title album dow
  • 在 Visual Studio 2013 中从模型生成数据库时出错

    我已经安装了VS2013 但仍然有VS2012 在 VS2013 中 我无法从实体框架中的模型生成数据库 我收到以下错误消息 错误信息中的文件确实存在 有谁知道我该如何解决这个问题 你关于检查驱动器的提示让我看到了我之前应该看到的东西 环境
  • PDO异常在laravel中找不到驱动程序

    我试图在 laravel 5 中执行迁移命令 但它显示 PDOException 错误 我将database php 文件更改为以下内容 mysql gt driver gt mysql host gt env DB HOST localh
  • 处理搜索的最佳实践

    我有一个SearchView设置 我有一个松散解耦的架构 使用Retrofit and Otto 我想知道什么最佳实践用于 Android 中的搜索 或任何一般的移动应用程序 意味着类似的东西也可以应用于 iOS 具体来说 我正在使用Aut
  • 有人可以解释一下人工神经网络吗? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 根据维基百科 http en wik
  • 存在于多个目录中的实体的 Hibernate 注释

    我有一个由 Hibernate 映射到数据库目录 Active 中的数据库表的 Person 实体 一段时间后 活动 目录中该数据库表中的记录将被存档 移动到数据库目录 历史 中该表的精确副本 我需要从活动目录和历史目录中检索 有没有比创建
  • 使用标准 .Net 异步模式的优点?

    我正在设计一个执行长时间运行任务的类 我想到的第一个设计是 public TaskHandle DoSomethingAsync DoSomethingCompleteCallback completedCallback public vo
  • 如何以编程方式使用密码锁定 Android 设备

    我正在尝试创建一个应用程序 允许用户使用网站上的密码锁定他的 Android 设备 所以我必须找到一种以编程方式锁定设备的方法 这意味着是否有任何人拥有允许我为设备设置密码的代码 当我解锁屏幕时 它要求输入代码才能访问家庭 所选择的答案是正
  • 使用“dotnet dev-certs https”创建的证书的默认位置是什么

    遵循 dot net core CLI 命令可以创建证书 dotnet 开发者证书 https 该命令有一个可选参数用于指定导出路径 如果不指定此路径 有谁知道证书会去哪里 似乎命令的帮助输出 dotnet dev certs help 似
  • 如何在 Spring Boot 中为 mongodb 存储库进行自定义排序查询?

    我想把这个查询与 Query我的存储库中的注释 这是查询 db report find company Random sort reportDate 1 limit 1 使用 Query 注释或使用 MongoTemplate 实现自定义查
  • 如何将成员函数指针传递给采用常规函数指针的函数?

    我有一个如下所示的玩家类 精简为该问题所需的内容 class Player public Player Player void kill void death void reset The kill death and reset 函数如下
  • HTTP 查询字符串中哪些字符必须转义?

    此问题涉及 URL 查询字符串部分中的字符 这些字符出现在 标记字符 Per 维基百科 http en wikipedia org wiki Query string 某些字符保留原样 而其他字符则进行编码 通常使用 转义序列 我一直在尝试