【问题标题】:Spoofing HTTP Referrer data using ASP.NET使用 ASP.NET 欺骗 HTTP Referrer 数据
【发布时间】:2023-04-02 08:10:02
【问题描述】:

这里和其他各种网站上的答案通常充满警告,不要信任 HTTP Referrer 标头,因为它们“很容易”被欺骗或伪造。

在我走得更远之前 - 不,我并不擅长 - 但我确实想运行一些依赖于推荐人的测试。

虽然我不怀疑关于虚假推荐人的警告是真实的,但我真的找不到关于如何操纵它们的详细信息。就连Wikipedia article也只是泛泛而谈。

我即将使用 RefControl addin for FireFox。

以编程方式(特别是在 ASP.NET 中)UrlReferrer 是一个只读属性,所以如果我无法设置它,我看不出如何使用虚假的引用数据触发请求?我真的必须手动完成吗?

如何使用 ASP.NET 向我的站点发送一个请求,其中包含用户提供的变量以填充引荐来源标头?

编辑:根据我在下面的评论,理想情况下,我希望接收传入请求,处理引荐来源数据,然后将请求原封不动地传递到另一个页面。如果我可以通过从头开始构建一个新的并复制原始属性来使其显示完整,那也很好。

【问题讨论】:

  • 您的意思是WebRequest.Create 发送请求,而不是ASP.NET?或者您是否在没有实际通过 Web 请求的情况下对您的页面进行单元测试,即您需要模拟上下文类以便修改它们?
  • 好吧,我想我会使用 ASP.NET 来执行一种“直通”请求,即当我访问我的测试页面时,它只是在将我的请求传递到另一个页面之前操纵引荐来源网址.如果我可以使用 WebRequest 做到这一点,那么您的问题的答案是“是”!

标签: asp.net referrer spoofing


【解决方案1】:

我不知道这是否正是您想要的,但总的来说,您应该能够通过使用一点反射。

例如:

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/"

如果您使用 ILSpy 打开 System.Web 程序集,您会注意到 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;
    }
}

【讨论】:

  • 谢谢,这看起来很有希望。如果我使用Response.Redirect,则不会保留虚假引荐来源网址,但可以使用Server.Transfer
  • @Widor 很有趣,但很有意义。 Response.Redirect 往返浏览器并返回服务器。
【解决方案2】:

这可能不会让你得到你想要的。但是您可以编辑 HttpWebRequest 的引用者。我认为没有办法在上下文中编辑您的请求的引用者。

using System.Net;

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-05
    • 2012-07-10
    • 2013-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多