我对如何防止跨站点伪造感到有点困惑。仍然。我知道那里有大量的信息,但我很困惑。
在Steven Anderson's post中,他描述了一个这样的表格:
<body onload="document.getElementById('fm1').submit()">
<form id="fm1" action="http://yoursite/UserProfile/SubmitUpdate" method="post">
<input name="email" value="hacker@somewhere.evil" />
<input name="hobby" value="Defacing websites" />
</form>
</body>
在别人的网站上。
给出的解决方案是由服务器生成的“防伪”令牌,该令牌以隐藏形式发送回任何请求。这很酷,但是什么阻止黑客只是下载表单页面,提取令牌并发布它?
我的申请是:在注册我的网站时,我想要一个AJAX函数,它将当前输入的用户名发送到服务器,如果可用,它应该响应“真/假”。这发生在onKey上,因此用户可以选择尚未使用的用户名。当满足“新用户”的所有条件时,“提交”按钮将启用。
显然,对于黑客来说,这是一个利用该服务“测试”大量用户名以查看它们是否可用的机会 - 我知道这不是网络银行级别的风险,但我仍然只想服务来自我的应用程序的请求,而不是黑客。
有关这些查询的任何想法吗?
更新:
所以在我的场景中。我生成一个令牌(比如客户端IP地址的一些散列值),如果服务器提供有关用户名是否可用的信息,服务期望收到该消息。
- 问题仍然存在,域外的某人只是调用服务,例如/generateToken
这看着客户的IP ......可能是一个知道的黑客。
返回
{ token: 4uru32br }
然后将其提交给/ isUsernameAvailable?token = 4uru32br&amp; partialUsername = usernam
这会让我感到什么?
答案 0 :(得分:0)
什么是阻止黑客只下载表单页面,提取令牌并发布它?
same-origin policy,这是什么。
我喜欢AJAX函数,它将当前输入的用户名发送到服务器,该服务器应响应&#34; True / False&#34;如果可用或不可用。
那是一个用户枚举漏洞。
有关这些查询的任何想法吗?
这是您的新流程:
使用电子邮件地址作为用户名。
使用CAPTCHA防止注册表单自动化。
电子邮件用户名不存在:
显示&#34;成功&#34;信息。使用一次性链接向地址发送电子邮件。使用该链接返回您的站点后注册用户。
电子邮件用户名确实存在:
显示&#34;成功&#34;信息。发送电子邮件到该地址,并带有消息说&#34;有人正在尝试使用此地址创建一个帐户,但它已经存在&#34;。
答案 1 :(得分:0)
您正在混淆CSRF和user enumeration。
给出的解决方案是&#34;防伪&#34;令牌,由服务器生成, 以隐藏形式发送回任何请求。那&#39; S 很酷,但是什么是阻止黑客只下载表单页面, 提取令牌并发布它?
Say Bob是您网站上的普通用户。
查克是一个邪恶的攻击者。
Bob访问您的网站并提交评论表单(在您的代码示例中)。如果存在CSRF保护,则此表单中也包含一个令牌:
<input type="hidden" name="csrf_token" value="zxcvbnnmm1235152" />
Bob的会话为服务器端存储了令牌zxcvbnnmm1235152
。
Chuck还登录了您的网站,因为他已注册。
但是,当他进入此页面时,他会获得此令牌:
<input type="hidden" name="csrf_token" value="lklkljlk898977" />
如果Chuck下载该页面,请以某种方式获取Bob(例如向他发送电子邮件)以访问Chuck服务器上的此页面,因为csrf_token
与Bob不匹配, Chuck不能将消息发布为Bob。
Bob可以继续正常,因为表单中的令牌与其会话相关联的令牌匹配。
CSRF是关于阻止Chuck使用Bob的浏览会话以Bob的形式提交内容。
我的申请是:在注册我的网站时我很喜欢 一个AJAX函数,用于将当前输入的用户名发送给 服务器应该响应&#34;真/假&#34;如果可用或不可用。 这发生在onKey上,因此用户可以选择尚未使用的用户名 已经使用过。所有条件都会启用“提交”按钮 为&#34;新用户&#34;满足了。
显然,这是黑客使用该服务的机会 &#34;测试&#34;很多用户名,看看它们是否可用 - 我知道它不是 确切地说是网上银行的风险,但我还是喜欢 仅服务来自我的应用程序的请求,而不是黑客。
是的,这是您的用户枚举漏洞。
将用户名作为电子邮件,并按照this answer了解如何确保此安全。
答案 2 :(得分:-1)
防伪令牌不是随机码。对于多个请求,也不是重复使用的令牌。
相反,服务器将令牌与呼叫者ip-address或会话耦合,例如通过使用服务器密钥加密ip + salt。
因此,如果攻击者试图从您的网站下载令牌,那么它将无法被真实客户端使用