只是检查Referer标题足以阻止CSRF?

时间:2015-02-21 22:11:37

标签: python csrf csrf-protection

比较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))

1 个答案:

答案 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允许设置通常不可能的标头。