Request.IsLocal是安全还是可以欺骗?

时间:2013-09-25 16:20:41

标签: asp.net security

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

以前我使用appsetting来告诉页面它是否处于开发模式,并且在dev模式下它会加载固定的用户身份。然后我发现了Request.IsLocal

我可以这样检查:

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

这样安全吗?恶意用户有什么方法可以欺骗IsLocal吗?

4 个答案:

答案 0 :(得分:9)

我认为你的实际问题是,你如何只开发功能?

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

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

我认为这比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;
   } 

答案 1 :(得分:6)

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

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

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

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

答案 2 :(得分:2)

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

但是,你可以做到

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

在开发框中,运行Debug构建。在生产中,部署发布版本。

答案 3 :(得分:1)

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

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

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

=&GT;如果可能,请使用不同的身份验证机制

相关问题