首页 > 后端开发 > C++ > 如何防止 URL 编码修改 GET 请求中的百分比编码斜杠?

如何防止 URL 编码修改 GET 请求中的百分比编码斜杠?

Linda Hamilton
发布: 2025-01-05 03:38:43
原创
638 人浏览过

How Can I Prevent URL Encoding from Modifying a Percent-Encoded Slash in a GET Request?

克服 GET 请求期间的斜杠 URL 编码困境

尝试将 HTTP GET 请求发送到包含百分比编码的 URL斜杠 (/),例如“http://example.com//”,一种常见的方法是将 WebClient 类用作如下:

using (WebClient webClient = new WebClient())
{
  webClient.DownloadData("http://example.com/%2F");
}
登录后复制

但是,这种方法会导致意想不到的结果。斜杠字符在传输过程中会转换为额外的斜杠,从而导致发送以下请求:

GET // HTTP/1.1
Host: example.com
Connection: Keep-Alive
登录后复制

通过 HTTP/GET 使用 OCSP 时会出现此问题,这需要传输实际的 / 而不是 '/ ' 以确保协议合规性。

一个潜在的解决方案

虽然不理想,但以下代码片段提供了该问题的解决方法:

Uri uri = new Uri("http://example.com/%2F");
ForceCanonicalPathAndQuery(uri);
using (WebClient webClient = new WebClient())
{
  webClient.DownloadData(uri);
}

void ForceCanonicalPathAndQuery(Uri uri){
  string paq = uri.PathAndQuery; // need to access PathAndQuery
  FieldInfo flagsFieldInfo = typeof(Uri).GetField("m_Flags", BindingFlags.Instance | BindingFlags.NonPublic);
  ulong flags = (ulong) flagsFieldInfo.GetValue(uri);
  flags &= ~((ulong) 0x30); // Flags.PathNotCanonical|Flags.QueryNotCanonical
  flagsFieldInfo.SetValue(uri, flags);
}
登录后复制

此解决方法涉及修改 Uri 对象的内部标志以强制 CanonicalPathAndQuery,确保在传输过程中保留斜杠字符。

免责声明

需要注意的是,这种方法不保证与未来版本兼容框架的。修改内部类行为时始终谨慎行事。

以上是如何防止 URL 编码修改 GET 请求中的百分比编码斜杠?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板