Подмена данных HTTP Referrer с использованием ASP.NET

Ответы здесь и на других сайтах часто полны предупреждений не доверять заголовкам HTTP Referrer, потому что их «так легко» подделать или подделать.

Прежде чем я пойду дальше — нет, я не замышляю ничего хорошего — но я хочу запустить некоторые тесты, зависящие от реферера.

Хотя я не сомневаюсь, что предупреждения о поддельных реферерах верны, я не могу найти подробной информации о том, как ими можно манипулировать. Даже в статье Википедии об этом говорится только в общих чертах.

Я собираюсь поиграть с надстройкой RefControl для FireFox.

Программно (в частности, в ASP.NET) UrlReferrer является свойством только для чтения, поэтому я не понимаю, как я могу запускать запросы с поддельными данными реферера, если я не могу его установить? Мне действительно нужно делать это вручную?

Как мне использовать ASP.NET для отправки запроса на мой сайт с переменной, предоставленной пользователем, для заполнения заголовка реферера?

EDIT: Согласно моему комментарию ниже, я в идеале хочу принять входящий запрос, обработать данные реферера, а затем передать запрос на другую страницу без изменений. Если я могу сделать так, чтобы он выглядел неповрежденным, создав новый с нуля и скопировав исходные свойства, то это тоже хорошо.


person Widor    schedule 04.10.2011    source источник
comment
Вы имеете в виду WebRequest.Create для отправки запроса, а не ASP.NET ? Или вы выполняете модульное тестирование своих страниц без фактического прохождения веб-запроса, то есть вам нужно имитировать классы контекста, чтобы вы могли их изменить?   -  person Rup    schedule 04.10.2011
comment
Что ж, я подумал, что буду использовать ASP.NET для выполнения своего рода сквозного запроса, т. Е. Когда я посещаю свою тестовую страницу, он просто манипулирует реферером, прежде чем передать мой запрос на другую страницу. Если я могу сделать это с помощью WebRequest, то ответ на ваш вопрос — да!   -  person Widor    schedule 04.10.2011


Ответы (2)


Я не знаю, точно ли это то, что вы хотите, но в целом вы должны иметь возможность подделать значение свойства UrlReferer (даже если оно доступно только для чтения) в HttpContext.Current.Request, используя немного отражения.

Например:

FieldInfo fi = HttpContext.Current.Request.GetType().GetField("_referrer", BindingFlags.NonPublic | BindingFlags.Instance);

string initialReferer = HttpContext.Current.Request.UrlReferrer.ToString();
if (fi != null)
    fi.SetValue(HttpContext.Current.Request, new Uri("http://example.com"));
string fakedReferer = HttpContext.Current.Request.UrlReferrer.ToString();

На ВС; это значения до и после изменения UrlReferrer:

initialReferer
"http://localhost/Test/Default.aspx"
fakedReferer
"http://example.com/"

Если вы откроете сборку System.Web с помощью ILSpy, вы заметите, что свойство UrlReferrer выглядит примерно так:

public Uri UrlReferrer
{
    get
    {
        if (this._referrer == null && this._wr != null)
        {
            string knownRequestHeader = this._wr.GetKnownRequestHeader(36);
            if (!string.IsNullOrEmpty(knownRequestHeader))
            {
                try
                {
                    if (knownRequestHeader.IndexOf("://", StringComparison.Ordinal) >= 0)
                    {
                        this._referrer = new Uri(knownRequestHeader);
                    }
                    else
                    {
                        this._referrer = new Uri(this.Url, knownRequestHeader);
                    }
                }
                catch (HttpException)
                {
                    this._referrer = null;
                }
            }
        }
        return this._referrer;
    }
}
person Icarus    schedule 04.10.2011
comment
Спасибо, это выглядит многообещающе. Если я использую Response.Redirect, поддельный реферер не сохраняется, но работает с Server.Transfer. - person Widor; 04.10.2011
comment
@Widor интересно, но имеет смысл. Response.Redirect делает круговой обход в браузер и обратно на сервер. - person Icarus; 04.10.2011

Скорее всего, это не даст вам того, что вы хотите. Но вы можете отредактировать Referror HttpWebRequest. Я не думаю, что есть способ отредактировать реферер вашего запроса в контексте.

using System.Net;

HttpWebRequest Req= (HttpWebRequest)System.Net.HttpWebRequest.Create("http://somewhere.com/");
Req.Referer = "http://www.fakesite.com";
person Doozer Blake    schedule 04.10.2011