【问题标题】:Prevent unescaping url in outbound request防止在出站请求中转义 url
【发布时间】:2020-01-21 17:29:55
【问题描述】:

如果我在 .Net Core 3.1 中这样做:

await new HttpClient().GetAsync("http://test.com/page?parameter=%2D%2E%5F%2E%2D");

然后会发生这种情况:

GET http://test.com/page?parameter=-._.- HTTP/1.1

但这就是我想要的:

GET http://test.com/page?parameter=%2D%2E%5F%2E%2D HTTP/1.1

背景是我从第三方获得了一个签名的 URL,我需要按原样使用该 url,非未转义。我设法找到带有未转义 url 的资源,但签名检查在另一端失败,因为他们在请求中看到的 url 不是已签名的 url。

我可以将 url 粘贴到任何浏览器并获取资源,但是当我在 .Net Core 3.1 中以编程方式执行此操作时签名检查失败。

应该根据documentation on the Uri Class 进行转义:

转义字符(也称为百分比编码八位字节) 具有保留用途的被解码(也称为未转义)。 这些未保留的字符包括大写和小写字母 (%41-%5A 和 %61-%7A)、十进制数字 (%30-%39)、连字符 (%2D)、句点 (%2E)、下划线 (%5F) 和波浪号 (%7E)。

我已经尝试过这些问题中列出的解决方案:

那么,有谁知道我如何在 .Net Core 3.1 上按原样使用已签名的 url,而不是未转义的?

【问题讨论】:

  • http://test.com/page?parameter=-._.- 是合法的url,不需要编码
  • 是的,但我的网址是http://test.com/page?parameter=%2D%2E%5F%2E%2D,问题是它正在被解码。我想使用它未解码、未转义、原始和原样

标签: c# .net-core urlencode


【解决方案1】:

所以在摆弄了一下之后,我想出了这个:

private static Uri CreateNonUnescapedUri(string url)
{
    // Initiate Uri as e.g "http://test.com" so internal flags will indicate that the url does not include characters that needs unescaping
    int offset = url.IndexOf("://");
    offset = url.IndexOf('/', offset + 4);
    var uri = new Uri(url.Substring(0, offset));

    // Then replace internal field with complete url that would otherwise be unescaped
    typeof(Uri).GetField("_string", BindingFlags.Instance | BindingFlags.NonPublic).SetValue(uri, url);
    return uri;
}

我在 300 个签名的网址上对其进行了测试。

Offcourse 改变 Uri 的内部状态,即 5600 行纯粹的疯狂在未来肯定会失败,但我需要在星期一之前完成这项工作,这就是我所拥有的。如果有人有真正的解决方案,请告诉我。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-03
    • 1970-01-01
    • 2014-08-31
    • 2019-05-26
    • 2023-02-20
    • 2020-05-02
    • 1970-01-01
    相关资源
    最近更新 更多