如何判断请求是否来自代理?

时间:2009-03-27 14:39:09

标签: asp.net proxy http-request

是否可以检测是否通过代理服务器发出传入请求?如果Web应用程序通过IP地址“禁止”用户,他们可以通过使用代理服务器来绕过这一点。这只是阻止这些请求的一个原因。如何实现这一目标?

4 个答案:

答案 0 :(得分:7)

恕我直言,没有100%可靠的方法来实现这一目标,但是以下任何标题的存在都强烈表明请求是从代理服务器路由的:

via:
forwarded:
x-forwarded-for:
client-ip: 

您还可以在客户端域名中查找代理 pxy

答案 1 :(得分:7)

如果正确设置了代理服务器以避免检测到代理服务器,您将无法分辨。

大多数代理服务器都提供标头,正如其他人提到的那样,但代理服务器上没有提供标题,意在完全隐藏用户。

您需要采用多种检测方法,例如Cookie,代理标头检测以及IP启发式方法来检测此类情况。查看http://www.osix.net/modules/article/?id=765以获取有关此情况的一些信息。还要考虑使用代理黑名单 - 它们由许多组织发布。

然而,没有什么是100%肯定的。您可以采用上述策略来避免大多数简单的情况,但最终它只是一系列形成TCP / IP事务的数据包,并且TCP / IP协议不是根据当今关于安全性,身份验证等的想法开发的。

请记住,许多公司出于各种原因部署公司范围的代理,如果您只是阻止代理作为一般规则,则必然会限制您的受众,这可能并不总是可取的。但是,这些代理通常会使用适当的标头声明自己 - 您最终可能会阻止合法用户,而不是擅长隐藏自己的用户。

- 亚当

答案 2 :(得分:1)

在我的域名在Google的AppSpot.com上托管之后,我已经注入了一些内容,其中注入了很好的硬核色情广告(感谢Google)。

从这个htaccess idea开始,我正在做以下事情,这似乎正在起作用。我为AppSpot添加了一个特定的规则,它注入了一个HTTP_X_APPENGINE_COUNTRY ServerVariable。

    Dim varys As New List(Of String)
    varys.Add("VIA")
    varys.Add("FORWARDED")
    varys.Add("USERAGENT_VIA")
    varys.Add("X_FORWARDED_FOR")
    varys.Add("PROXY_CONNECTION")
    varys.Add("XPROXY_CONNECTION")
    varys.Add("HTTP_PC_REMOTE_ADDR")
    varys.Add("HTTP_CLIENT_IP")
    varys.Add("HTTP_X_APPENGINE_COUNTRY")
    For Each vary As String In varys
        If Not String.IsNullOrEmpty(HttpContext.Current.Request.Headers(vary)) Then HttpContext.Current.Response.Redirect("http://www.your-real-domain.com")
    Next

答案 3 :(得分:0)

您可以在请求对象中查找这些标头,并相应地决定请求是通过代理/不是

1)Via 2)X-Forwarded-For

请注意,这不是100%确定的镜头技巧,取决于这些代理服务器是否选择添加上述标头。