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

Sli*_*345 8 asp.net security

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

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

我可以这样检查一下:

if(Request.IsLocal){
   FormsAuthentication.SetAuthCookie("testUser", false);
}else{
   FormsAuthentication.SetAuthCookie(/*EncryptedCookieValue*/, false);
}
Run Code Online (Sandbox Code Playgroud)

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

Ral*_*oss 9

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

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

它返回在IIS或Windows服务运行时,当自己是一个用户界面,即Visual Studio中,当你发展.

我认为这比DEBUG预处理器变量更好,因为行为更加一致,您可能会意外地将dll的DEBUG版本上传到您的实时环境,除非您的构建/发布过程非常紧密.

根据经验,从客户端信任任何东西都不是一个好主意.
我也是务实的,你在保护什么,有人会去做多少努力?

下面的SO帖子探讨了你不应该相信它的一些原因:
我可以欺骗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;
   } 
Run Code Online (Sandbox Code Playgroud)


Sil*_*Fox 6

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

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

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

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