一尘不染

使用URL编码的斜杠获取URL

c#

我想发送HTTP GET到http://example.com/%2F。我的第一个猜测是这样的:

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

不幸的是,我可以看到网络上实际发送的是:

GET // HTTP/1.1
Host: example.com
Connection: Keep-Alive

所以http://example.com/%2F被翻译成http://example.com//发送之前。

有没有一种方法可以实际发送此GET请求?

OCSP协议要求在HTTP / GET上使用OCSP时必须发送base-64编码的url编码,因此有必要发送实际的%2F而不是’/’以使其兼容。

编辑:

这是OCSP协议标准(RFC 2560附录A.1.1)的相关部分:

使用GET方法的OCSP请求的构造如下:

GET {url} / {url-encoding of OCSPRequest的DER编码的base-64编码}

我很乐意接受其他阅读,但是我看不出还有什么意思。


阅读 205

收藏
2020-05-19

共1个答案

一尘不染

默认情况下,Uri该类将不允许在URI中使用转义/字符(%2f)(即使在我阅读RFC
3986时
这似乎是合法的)。

Uri uri = new Uri("http://example.com/%2F");
Console.WriteLine(uri.AbsoluteUri); // prints: http://example.com//

(注意:请勿使用Uri.ToString来打印URI。)

根据Microsoft
Connect上此问题错误报告,此行为是设计使然,但是您可以通过将以下内容添加到app.config或web.config文件中来解决此问题:

<uri>
  <schemeSettings>
    <add name="http" genericUriParserOptions="DontUnescapePathDotsAndSlashes" />
  </schemeSettings>
</uri>

(从https://stackoverflow.com/a/10415482转发,因为这是避免使用此错误的“官方”方式,而无需使用反射来修改私有字段。)

编辑: “连接错误”报告不再可见,但是的文档<schemeSettings>建议使用此方法以允许/URI中的转义字符。请注意(根据该文章),如果组件不能正确处理转义的斜杠,可能会对安全性产生影响。

2020-05-19