比较Referer http标头足以阻止CSRF,我在下面有以下html代码。
<div id="Message"></div><br>
Username:<br>
<input type="text" name="Username" id="Username"><br>
Password:<br>
<input type="password" name="Password" id="Password"><br>
Keep me logged in:<br>
<input type="checkbox" id="KeepSessionAlive"><br>
<input type="submit" onClick="ProcessLogin();">
<script>
function ProcessLogin(){
Username=document.getElementById("Username").value;
Password=document.getElementById("Password").value;
KeepSessionAlive=document.getElementById("KeepSessionAlive").value;
var xmlhttp;
if (window.XMLHttpRequest){// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();
}else{// code for IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange=function(){
if (xmlhttp.readyState==4 && xmlhttp.status==200){
document.getElementById("Message").innerHTML=xmlhttp.responseText;
}
}
xmlhttp.open("POST","/Login/Process",true);
xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
xmlhttp.send("<A>Username</A><B>"+Username+"</B><A>Password</A><B>"+Password+"</B><A>KeepSessionAlive</A><B>"+KeepSessionAlive+"</B>");
}
</script>
这只是一个标准的html表单,但我想知道如果我使用下面的代码,我可以完全免受CSRF攻击。
class LoginProcess(webapp2.RequestHandler):
def post(self):
self.response.headers['Content-Type'] = 'text/plain'
HTTTP_REFERER=self.request.referer
if HTTP_REFER=="http://example.com":
self.response.write('Referer: '+cgi.escape(HTTTP_REFERER))
答案 0 :(得分:4)
是的,这已足够,但它被认为是一种较弱的保护形式:
虽然自己欺骗referer标头是微不足道的 浏览器,在CSRF攻击中不可能这样做。检查 referer是一种防止嵌入式CSRF的常用方法 网络设备,因为它不需要每用户状态。这个 当记忆存在时,使引用者成为CSRF预防的有用方法 稀缺。这种CSRF缓解方法也常用于 未经身份验证的请求,例如在建立之前提出的请求 需要跟踪同步的会话状态 令牌。
然而,检查引用者被认为是较弱的 CSRF保护。例如,打开重定向漏洞即可 用于利用受引用者保护的基于GET的请求 检查和一些组织或浏览器工具删除引用标头 作为一种数据保护形式。也有共同的实施 引用检查错误。例如,如果CSRF攻击 源自HTTPS域,然后将省略引用。在 在这种情况下,缺少引用者应被视为攻击 当请求执行状态更改时。还要注意 攻击者对引用者的影响有限。例如,如果 受害者的域名是&#34; site.com&#34;然后攻击者拥有CSRF漏洞 源自&#34; site.com.attacker.com&#34;这可能会欺骗一个破碎的引用者 检查实施。 XSS可用于绕过引用者检查。
简而言之,引用者检查是CSRF入侵的一种合理形式 检测和预防,即使它不是一个完整的保护。 引用检查可以检测到一些攻击但不能阻止所有攻击。对于 例如,如果您的HTTP引用来自不同的域,那么您就是 期待来自您的域的请求,您可以安全地阻止它 请求。
如果你想要一个&#34;快速方法&#34;从XHR防止CSRF,你可以设置和检查自定义标题,如X-Requested-With
。目前这是安全的,但推荐的方法是Synchronizer Token Pattern。这对于浏览器插件中的漏洞更为强大,例如old vulnerability in Flash允许设置通常不可能的标头。