有效防范CSRF攻击的手段有哪些?

有效防范CSRF攻击的手段有哪些?,第1张

此前,我为大家介绍过SSRF攻击、XSS攻击以及SQL注入攻击的原理及防范手段,本篇文章我将为大家介绍一下CSRF攻击-跨站请求伪造。那么CSRF攻击是什么?防范手段有哪些?具体内容请看下文。

CSRF攻击是什么?

CSRF,全拼为Cross-site request forgery,也被称为one-click attack或者session

riding,中文名称叫跨站请求伪造。一般来说,攻击者通过伪造用户的浏览器的请求,向访问一个用户自己曾经认证访问过的网站发送出去,使目标网站接收并误认为是用户的真实 *** 作而去执行命令。常用于盗用账号、转账、发送虚假消息等。

攻击者利用网站对请求的验证漏洞而实现这样的攻击行为,网站能够确认请求来源于用户的浏览器,却不能验证请求是否源于用户的真实意愿下的 *** 作行为。

CSRF攻击防范手段有哪些?

第一、验证HTTP Referer字段

HTTP头中的Referer字段记录了该HTTP请求的来源地址。在通常情况下,访问一个安全受限页面的请求来自于同一个网站,而如果黑客要对其实施CSRF攻击,他一般只能在他自己的网站构造请求。因此,可以通过验证Referer值来防御CSRF攻击。

第二、使用验证码

关键 *** 作页面加上验证码,后台收到请求后通过判断验证码可以防御CSRF。但这种方法对用户不太友好。

第三、在请求地址中添加token并验证

CSRF攻击之所以成功,是因为黑客可以完全伪造用户的请求,该请求中所有的用户验证信息都是存在于cookie中,因此黑客可以在不知道这些验证信息的情况下直接利用用户自己的cookie来通过安全验证。要抵御CSRF,关键在于在请求中放入黑客所不能伪造的信息,并且该信息不存在于cookie中。可以在HTTP请求中以参数的形式加入一个随机产生的token,并在服务器端建立一个拦截器来验证这个token,如果请求中没有token或者token内容不正确,则认为可能是CSRF攻击而拒绝该请求。这种方法要比检查Referer要安全,token可以在用户登陆后产生并放于session中,然后在每次请求时把token从session中拿出,与请求中的token进行比对,但这种方法的难点在于如何把token以参数的形式加入请求。

对于get请求,token将附在请求地址之后,这样URL就变成:http://url?csrftoken=tokenvalue。

对于post请求,要在form的最后加上<input

type="hidden" name="csrftoken" value="tokenvalue"/>,这样就把token以参数的形式加入请求了。

第四、在HTTP头中自定义属性并验证

这种方法也是使用token并进行验证,和上一种方法不同的是,这里并不是把token以参数的形式置于HTTP请求中,而是把它放到HTTP头中自定义的属性里。通过XMLHttpRequest这个类,可以一次性给所有该类请求加上csrftoken这个HTTP头属性,并把token值放入其中。这样解决了上种方法在请求中加入token的不便同时,通过XMLHttpRequest请求的地址不会被记录到浏览器的地址栏,也不用担心token会透过Referer泄露到其他网站中去。

使用Java Request添加令牌可以有效地提供客户端和服务器之间的身份验证和授权,确保客户端发出的请求是可信任的。要添加令牌,首先需要在服务器端生成一个令牌,然后将其作为Header部分发送给客户端,最后,客户端将令牌作为参数附加到request中,发送给服务器。服务器端收到请求后,会检查令牌是否有效,如果有效,则表示客户端的身份可信任,服务器可以处理该请求。

登陆获取token保存在本地,在请求头添加参数

登陆:

$.ajax({

        url : 'http://119.254.155.151:8768/yq/dy/login',// 获取自己系统后台用户信息接口

        data :data,

        type : "post",

        dataType: "json",

        success : function(data) {

      const token = data.data.token

      window.localStorage.setItem('yq_token', token)

}

})

内部页面添加请求头:

var userToken = window.localStorage.getItem("yq_token")

  $.ajax({

          headers: {

            "token":userToken//此处放置请求到的用户token

          },

          type: "get",

          url: "http://119.254.155.151:8768/yq/important/data?schemeId=247248",//请求url

          contentType: "application/x-www-form-urlencoded",

          success: (data) =>{

}

})


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11770381.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-18
下一篇 2023-05-18

发表评论

登录后才能评论

评论列表(0条)

保存