前端面试题

day08-前端面试技巧-(安全类)

2019-03-10  本文已影响10人  东邪_黄药师
CERF:

基本概念和缩写:
CSRF(Cross-site request forgery)跨站请求伪造缩写CSRF

此时网站A在接收到请求之后已经判断当前用户是登录状态,所以恶意网站就可以根据用户的权限做具体的恶意操作了,造成网站攻击成功。
而攻击网站B在访问网站A的时候,浏览器会自动带上网站A的cookie
用户C再访问攻击网站B,网站B上有某个隐藏的链接或者图片标签会自动请求网站A的URL地址,例如表单提交,传指定的参数
用户C访问正常网站A时进行登录,浏览器保存A的cookie

下面将以 JavaScript 为例,对上述三种方法分别用代码进行示例。

1.验证 Referer

// 从 HTTP 头中取得 Referer 值
 var referer=req.headers.Referer; 
 // 判断 Referer 是否以 test.example 开头
 if((referer!=null) && (_.startsWith(referer, “test.example ”)){ 
    // 验证通过
 }else{ 
    // 验证失败,返回错误
 }

2.验证请求中的 token


 var session = req.session;

 // 从 session 中得到 csrftoken 属性
 var  token = session.csrftoken; 
 if(token == null){ 

    // 产生新的 token 放入 session 中
    token = generateToken(); 
    token.csrftoken = token ; 
   return ....
 } else{ 

    // 从 HTTP 头中取得 csrftoken 
    var  token = req.headers.csrftoken; 

    // 从请求参数中取得 csrftoken 
    var  xhrToken = req.param('csrftoken'); 
    if(token != null && xhrToken != null && token.equals(xhrToken)){ 
       return ...
    }else{ 
        return ...  // ERROR
    } 
 }
HTTP 头中自定义属性(网上例子)
var plainXhr = dojo.xhr; 

 // 重写 dojo.xhr 方法
 dojo.xhr = function(method,args,hasBody) { 
    // 确保 header 对象存在
    args.headers = args.header || {}; 
        
    tokenValue = '<%=request.getSession(false).getAttribute("csrftoken")%>'; 
    var token = dojo.getObject("tokenValue"); 
    
    // 把 csrftoken 属性放到头中
    args.headers["csrftoken"] = (token) ? token : "  "; 
    return plainXhr(method,args,hasBody); 
 };

总结

CSRF 是一种危害非常大的攻击,又很难以防范。目前几种防御策略虽然可以很大程度上抵御 CSRF 的攻击,但并没有一种完美的解决方案。一些新的方案正在研究之中,比如对于每次请求都使用不同的动态口令,把 Referer 和 token 方案结合起来,甚至尝试修改 HTTP 规范,但是这些新的方案尚不成熟,要正式投入使用并被业界广为接受还需时日。在这之前,我们只有充分重视 CSRF,根据系统的实际情况选择最合适的策略,这样才能把 CSRF 的危害降到最低

XSS
image.png image.png
上一篇下一篇

猜你喜欢

热点阅读