我有一个网页,在页面加载时检查加密的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吗?
我认为你的实际问题是,你如何只开发功能?
您可以使用: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)
代码IsLocal似乎很健壮 - 我看不出它的逻辑有任何缺陷,所以为了你的目的它应该没问题.
但是,您应该知道,如果您的应用程序(或在同一服务器上运行的任何其他应用程序)发出目标可能受最终用户影响的任何HTTP请求,那么您应该添加额外的安全层,例如秘密/过期密钥或者为您的请求提供令牌,或者您可以在建立时保护HTTP请求,以便无法请求本地资源.
例如,假设您的网站有一个终点,例如http://www.example.com/DeleteAllUsers,在处理此请求的代码中,您正在检查IsLocal以确保只有当用户是本地可信请求时才能删除用户.
现在假设您的网站上有一个功能输入一个网址来查看标题:用户http://www.example.com/DeleteAllUsers在此文本框中输入,导致您的应用程序请求DeleteAllUsers并满足IsLocal安全检查,因为HTTP请求来自您的应用程序.这是如何IsLocal被利用的,我意识到这是一个人为的例子来证明这一点,但许多网站都做类似的事情,比如抓取要显示的URL的预览图像.如果您的服务器上没有任何内容可以发出本地HTTP请求,那么您应该很高兴.
| 归档时间: |
|
| 查看次数: |
4475 次 |
| 最近记录: |