Как я могу заставить Uri использовать baseUri? - PullRequest
0 голосов
/ 17 июня 2020

Похоже, существует серьезная проблема с использованием класса Uri с базовыми URI. По какой-то причине это «особенность», заключающаяся в том, что, если передается относительный URI, и он выглядит как полный URL, класс Uri проигнорирует baseUri и вместо этого будет использовать относительный URI. Это может быть уязвимость системы безопасности, и я хотел бы понять, как ее избежать, но при этом получить возможности объединения базовых и относительных URI для создания единого URL-адреса в C# dotnetcore.

В приведенном ниже примере можно увидеть, что относительный uri http://badexample.com заставляет 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/

1 Ответ

0 голосов
/ 17 июня 2020

Ну, вы можете избежать ::

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

Это даст http://google.com/http%3A//badexample.com

О безопасности, Microsoft docs рекомендует при работе с пользовательский ввод, чтобы выполнить следующую проверку:

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.
}
...