Как изменить протокол http/https при использовании относительного URL-адреса

URL-адреса, относящиеся к протоколу, не являются тем, что я ищу. Я ищу способ абсолютно указать протокол (http vs https), сохраняя имя хоста относительного URL.

Учитывая относительный URL-адрес, например "/SearchForStuff", я хочу иметь возможность указывать другой протокол "https vs. http" и т.д., не указывая имя хоста/домена.

Наш сайт имеет частичное представление заголовка, которое мы показываем в верхней части каждой страницы нашего сайта. Некоторые страницы на сайте - http, а некоторые - https. Заголовок содержит текстовое поле и кнопку для поиска по всему сайту. Страница результатов поиска сайта всегда предоставляется с использованием http, поэтому мы хотим, чтобы действие формы указывало на относительный путь "/find". Однако мы хотим, чтобы один и тот же заголовок работал на наших многочисленных внутренних тестовых серверах (10.10.10.123 и т.д.), А также наш публичный сервер ( "www.publicfacingserver.com" ), в идеале без изменения содержимого частичного представления заголовка. Поэтому, по сути, я ищу способ указать протокол для действия поиска, сохраняя относительное имя сервера/хоста.

В настоящее время, чтобы гарантировать, что пользователь не может ссылаться с защищенной страницы на защищенную страницу результатов поиска по сайту, мы строго кодируем абсолютный URL-адрес действия, используемого для поиска по сайту, в комплекте с протоколом и имя хоста, например "http://www.publicsite.com/find". Проблема в том, что нажатие на это действие на тестовом сервере перенаправляет вас на наш публичный сайт. Поэтому для тестирования мы делаем ручные изменения в нашем файле hosts для IP-адреса тестового сервера, чтобы он соответствовал нашему публичному имени сайта. Это ставит немного когнитивной нагрузки на себя как разработчиков, а также требует, чтобы мы посетили компьютер любого некодирующего человека, которого мы хотим протестировать наш сайт, чтобы настроить файл своих хостов перед тестированием, а после тестирования, чтобы отключить изменяет файл своего хоста.

Код ниже - лучшее решение, с которым я столкнулся. Кто-нибудь знает лучший способ? Если мое решение достаточно, создает ли какие-либо уязвимости безопасности? Я не вижу, как это могло произойти, поскольку, если злоумышленник должен подделать запрос нашей публике, столкнувшись с IP-адресом X, но с именем хоста в заголовке хоста, который не соответствует этому IP-адресу, это приведет к появлению неактивных URL-адресов предоставляемый обратно тому же пользователю. Другими словами, я не вижу, как кто-либо мог использовать это, чтобы создать эксплойт XSRF, разместив URL-адрес на доске объявлений на другом сайте или что-то подобное:

public static string CurrentHostName(this UrlHelper helper, HttpProtocol protocol)
{
    var result = string.Empty;

    if (protocol == HttpProtocol.Secure) result += "https://";
    if (protocol == HttpProtocol.UnSecure) result += "http://";
    if (protocol == HttpProtocol.Current) result += HttpContext.Current.Request.Url.Scheme;

    result += HttpContext.Current.Request.Url.Host;

    if (HttpContext.Current.Request.Url.Port != 80) result += ":" + HttpContext.Current.Request.Url.Port.ToString();

    return result;
}

HttpProtocol - это перечисление, которое я создал сам.

Спасибо!

Ответ 1

Я думаю, что вы запрашиваете формат URL, в котором размещается родственник, а не относительно протокола. Я не думаю, что возможно использование стандартного форматирования URL. Например, http:/path/filename не работает для этого.