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

URL-адреса, относящиеся к протоколу , не то, что я ищу. Я ищу способ полностью указать протокол (http против 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-адрес тестового сервера совпадал с именем нашего общедоступного сайта. Это накладывает некоторую когнитивную нагрузку на нас как разработчиков, а также требует, чтобы мы посетили компьютер любого человека, не занимающегося программированием, которого мы хотим протестировать на нашем сайте, чтобы настроить файл хостов перед тестированием, а после тестирования - отключить конфигурацию вносит изменения в их файл hosts.

Приведенный ниже код - лучшее решение, которое я придумал. Кто-нибудь знает способ лучше? Если мое решение адекватно, создает ли оно какие-либо уязвимости в безопасности? Я не понимаю, как это могло быть, поскольку, если бы злонамеренный пользователь подделал запрос на наш общедоступный 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 - это перечисление, которое я создал сам.

Спасибо!

10
задан 11 July 2011 в 13:19
поделиться