【问题标题】:Is Request.IsLocal secure or can it be spoofed?Request.IsLocal 是安全的还是可以被欺骗?
【发布时间】:2013-09-25 16:20:40
【问题描述】:

我有一个网页,它在页面加载时检查加密的 cookie 以确定用户身份。但是,当我在我的开发机器上本地测试页面时,我无法访问该 cookie。

之前我使用了一个 appsetting 来告诉页面它是否处于开发模式,当处于开发模式时它会加载一个固定的用户身份。然后我发现了 Request.IsLocal

我可以像这样简单地检查:

if(Request.IsLocal){
   FormsAuthentication.SetAuthCookie("testUser", false);
}else{
   FormsAuthentication.SetAuthCookie(/*EncryptedCookieValue*/, false);
}

这安全吗?恶意用户有没有办法欺骗 IsLocal?

【问题讨论】:

  • Request.IsLocal“请求发起者的 IP 地址是 127.0.0.1 或 [...] 与服务器的 IP 地址相同时返回 true。所以它可以被欺骗,因为IP地址可以被欺骗,当有某种代理或负载平衡服务器在同一台服务器上工作时,它就会完全撒谎。

标签: asp.net security


【解决方案1】:

我认为您的实际问题是,您如何拥有仅用于开发的功能?

您可以使用:Environment.UserInteractive
http://msdn.microsoft.com/en-us/library/system.environment.userinteractive.aspx

在 IIS 或 Windows 服务中运行时返回 false,当它们是用户界面时返回 true,即开发时返回 Visual Studio。

我认为这比 DEBUG 预处理器变量更好,因为行为更加一致,除非您的构建/发布过程非常紧凑,否则您可能会不小心将 dll 的 DEBUG 版本上传到您的实时环境。

根据经验,相信来自客户的任何东西都不是一个好主意。
我也很务实,你在保护什么?有人会付出多少努力才能入侵?

以下 SO 帖子探讨了您不应该信任它的一些原因:
Can I fool HttpRequest.Current.Request.IsLocal?

参考
您可以在http://referencesource.microsoft.com查看源代码

public bool IsLocal { 
   get {
      String remoteAddress = UserHostAddress; 

      // if unknown, assume not local
      if (String.IsNullOrEmpty(remoteAddress))
         return false; 

      // check if localhost 
      if (remoteAddress == "127.0.0.1" || remoteAddress == "::1") 
         return true;

      // compare with local address
      if (remoteAddress == LocalAddress)
         return true;

      return false;
   } 

【讨论】:

    【解决方案2】:

    IsLocal 的代码看起来很健壮 - 我看不出它的逻辑有任何缺陷,所以就您的目的而言,它应该没问题。

    但是,您应该注意,如果您的应用程序(或在同一服务器上运行的任何其他应用程序)发出的任何 HTTP 请求的目的地可能会受到最终用户的影响,那么您应该添加额外的安全层,例如秘密/expiring 请求的密钥或令牌,或者您可以在发出 HTTP 请求时保护 HTTP 请求,以便无法请求本地资源。

    例如假设您的网站有一个端点,例如 http://www.example.com/DeleteAllUsers,并且在处理此请求的代码中,您正在检查 IsLocal 以确保只有当它是本地的受信任请求时才能删除用户。

    现在假设您的网站上有一个功能输入网址以查看标题:并且用户在此文本框中输入http://www.example.com/DeleteAllUsers,导致您的应用程序请求DeleteAllUsers并满足IsLocal 安全检查,因为 HTTP 请求是从您的应用发出的。这就是IsLocal 可以被利用的方式,我意识到这是一个人为的例子来证明这一点,但是很多网站都做类似的事情,比如抓取要显示的 URL 的预览图像。如果您的服务器上没有任何东西可以发出本地 HTTP 请求,那么您应该很高兴。

    【讨论】:

    • 非常好。换句话说,即使你用IsLocal 保护你的网页,你仍然应该考虑CSRF attacks 之类的东西。
    • 是的,csrf 和 ssrf 的控制应该与IsLocal 检查一起实现。
    【解决方案3】:

    由于其他答案中提到的原因,您不应将此代码放在生产服务器上。

    但是,你可以这样做

    #if DEBUG
        if (Request.IsLocal)
        {
            FormsAuthentication.SetAuthCookie("testUser", false);
        }
        else
        {
    #endif
            FormsAuthentication.SetAuthCookie(/*EncryptedCookieValue*/, false);
    #if DEBUG
        }
    #endif
    

    在您的开发设备上,运行调试版本。在生产环境中,部署发布版本。

    【讨论】:

      【解决方案4】:

      确定远程 IP 很棘手,取决于正确配置服务器。

      例如,配置错误的服务器可能使用 X-Forwarded-For 来确定 IP,但它可以由客户端选择。但是当使用反向代理将其设置为自己的IP时,这是确定IP的正确方法。

      使用来自套接字的 IP 也可能是错误的,请考虑在机器上运行反向代理作为网络服务器。

      => 如果可能,使用不同的身份验证机制

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-07-27
        • 1970-01-01
        • 1970-01-01
        • 2015-09-15
        • 1970-01-01
        • 2023-03-09
        • 2011-04-10
        • 1970-01-01
        相关资源
        最近更新 更多