我有一个网页,在页面加载时检查加密的cookie以确定用户身份。但是,当我在我的开发盒上本地测试页面时,我无法访问该cookie。
以前我使用appsetting来告诉页面它是否处于开发模式,并且在dev模式下它会加载固定的用户身份。然后我发现了Request.IsLocal
我可以这样检查:
if(Request.IsLocal){
FormsAuthentication.SetAuthCookie("testUser", false);
}else{
FormsAuthentication.SetAuthCookie(/*EncryptedCookieValue*/, false);
}
这样安全吗?恶意用户有什么方法可以欺骗IsLocal吗?
答案 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;如果可能,请使用不同的身份验证机制