【问题标题】:Is just checking the Referer header enough to prevent CSRF?仅检查Referer 标头是否足以防止CSRF?
【发布时间】:2015-04-23 11:44:45
【问题描述】:

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

【问题讨论】:

    标签: python csrf csrf-protection


    【解决方案1】:

    是的,这就足够了,但它被认为是一种较弱的保护形式:

    虽然自己欺骗referer标头是微不足道的 浏览器,在 CSRF 攻击中是不可能的。检查 referer 是一种常用的在嵌入式上防止 CSRF 的方法 网络设备,因为它不需要每个用户的状态。这 当内存不足时,使引用者成为 CSRF 预防的有用方法 稀缺。这种缓解 CSRF 的方法也常用于 未经身份验证的请求,例如在建立之前提出的请求 跟踪同步所需的会话状态 令牌。

    但是,检查referer被认为是较弱的 CSRF 保护。例如,开放式重定向漏洞可能是 用于利用受引用者保护的基于 GET 的请求 检查并且某些组织或浏览器工具会删除推荐人标头 作为数据保护的一种形式。也有常见的实现 推荐人检查错误。例如,如果 CSRF 攻击 源自 HTTPS 域,则引用者将被省略。在 这种情况下,缺少引用者应被视为攻击 当请求正在执行状态更改时。另请注意, 攻击者对referer的影响有限。例如,如果 受害者的域是“site.com”然后攻击者有 CSRF 漏洞利用 源自“site.com.attacker.com”,它可能会欺骗一个损坏的引用者 检查实施。 XSS 可用于绕过referer 检查。

    简而言之,referer 检查是一种合理的 CSRF 入侵形式 检测和预防,即使它不是一个完整的保护。 Referer 检查可以检测到一些攻击,但不能阻止所有攻击。为了 例如,如果您的 HTTP 引荐来源网址来自不同的域,并且您是 只期望来自您的域的请求,您可以安全地阻止它 请求。

    如果你想要一种“快速方法”来阻止 CSRF 来自 XHR,你可以设置并检查自定义标头,例如 X-Requested-With。这目前是安全的,但是推荐的方法是Synchronizer Token Pattern。这对于浏览器插件中的缺陷更加稳健,例如 old vulnerability in Flash 允许设置通常不可能设置的标头。

    【讨论】:

      猜你喜欢
      • 2010-11-27
      • 2011-02-06
      • 2011-03-19
      • 2019-02-23
      • 2012-03-30
      • 1970-01-01
      • 1970-01-01
      • 2011-09-12
      相关资源
      最近更新 更多