Подмена данных HTTP Referrer с использованием ASP.NET - PullRequest
7 голосов
/ 04 октября 2011

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

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

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

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

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

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

РЕДАКТИРОВАТЬ: В соответствии с моим комментарием ниже, я в идеале хочу принять входящий запрос, манипулировать данными реферера и затем передать запрос на другую страницу, без изменений. Если я смогу заставить казаться нетронутым, построив новый с нуля и скопировав исходные свойства, то это тоже хорошо.

Ответы [ 2 ]

6 голосов
/ 04 октября 2011

Я не знаю, если это именно то, что вы хотите, но в целом вы должны иметь возможность подделать значение свойства 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();

На VS;это значения до и после изменения 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;
    }
}
3 голосов
/ 04 октября 2011

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

using System.Net;

HttpWebRequest Req= (HttpWebRequest)System.Net.HttpWebRequest.Create("http://somewhere.com/");
Req.Referer = "http://www.fakesite.com";
...