【问题标题】:How can I force Uri to use the baseUri?如何强制 Uri 使用 baseUri?
【发布时间】:2020-06-17 15:42:00
【问题描述】:

使用带有基本 URI 的 Uri 类似乎存在一个主要问题。出于某种原因,如果传入一个相对 URI 并且它似乎是一个完整的 URL,那么它是一个“功能”,Uri 类将忽略 baseUri 而只使用相对 Uri。这可能是一个安全漏洞,我想了解如何避免它,但仍然获得结合基本 URI 和相对 URI 以在 C# dotnetcore 中创建单个 URL 的功能。

在下面的示例中,您可以看到 http://badexample.com 的相对 uri 使 baseUri 不会出现在生成的 URI 中。这很危险。

using System;

public class Program
{
    public static void Main()
    {
        var baseUri = new Uri("http://google.com");
        var relativeUri = new Uri(baseUri, "search?q=stuff");
        Console.WriteLine(relativeUri);

        var badUri = new Uri(baseUri, "http://badexample.com");
        Console.WriteLine(badUri);
    }
}

输出:

http://google.com/search?q=stuff
http://badexample.com/

【问题讨论】:

  • 您可以使用IsBaseOf 来确定一个是否是另一个的基础。这是一种解决方法,但似乎有助于避免安全问题
  • 您期望的输出是什么? http://google.com/http://badexample.com?
  • @Magnetron 这将是可接受的输出(虽然可能是 url 编码)
  • 那就看看我的答案是否适合你

标签: c# .net-core uri


【解决方案1】:

好吧,你可以逃脱:

string relativeUrl = "http://badexample.com";
var badUri = new Uri(baseUri, relativeUrl.Replace(":","%3A"));

这将产生http://google.com/http%3A//badexample.com

关于安全,Microsoft docs recommends,在处理用户输入时,要做如下验证:

if (!Uri.TryCreate(baseUri, userInput, out Uri newUri))
{
    // Fail: invalid input.
}

if (!baseUri.IsBaseOf(newUri))
{
    // Fail: the Uri base has been modified - the created Uri is not rooted in the original directory.
}

【讨论】:

  • 我认为你答案的第二部分是一个可以接受的解决方案。第一部分可能不是一个很好的建议,因为它是一种编码 url 的非标准方式
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-27
  • 2010-10-08
  • 2010-09-15
相关资源
最近更新 更多