CSRF主要是指有些人使用自动表单提交不停的请求你的网站,或者使用非法请求连接访问站点,防止这些攻击也比较容易就是在自己网站做一个token验证基本就防止了非法请求,正常清楚我们生成的唯一token进行行为验证,如果token通过则执行操作,否则就不通过,防止了无限请求刷自己网站的情况。
首先生成token存到session中:
index.php
//生成一个密匙
function create_key()
{
$key = md5(((float) date("YmdHis") + rand(100,999)).rand(1000,9999));
return $key;
}
//产生token
function create_token(){
$key = create_key();
$salt = 'MYKEY';
$token = md5($salt.$key);
return $token;
}
session_start();
$_SESSION['client_key'] = create_token();
$_SESSION['server_key'] = $_SESSION['client_key'];
header("Location:login.php");
login.php
<!DOCTYPE html>
<html>
<head>
<title>csrf测试</title>
</head>
<body>
<?php
session_start();
$key = $_SESSION['client_key'];
?>
<form action="dologin.php" method="post">
用户名:<input name="name" type="text"/><br/>
密码:<input name="pass" type="text"/><br/>
<input type="hidden" name="csrf" value="<?php echo $key; ?>" /><br/>
<input type="submit" value="提交" />
</form>
</body>
</html>
dologin.php
<?php
sleep(1);
//print_r($_POST);
extract($_POST);
//判断key是否相等
session_start();
$server_key = $_SESSION['server_key'];
//判断是否有csrf参数
if (!array_key_exists('csrf', $_POST)) {
die("未知请求");
}
else if($server_key != $csrf){
die("参数错误");
}else{
die("正确请求业务逻辑处理");
}
?>
这些代码只是简单的验证了一下token,实际开发中,token的生成可能规则不是这么简单,这样写就防止,不法分子使用自动表单来不停的对网站发送请求了,那个防刷新表单重复提交其实,原理都差不多,不太难理解,大家随意参考下吧。
测试结果:
非法请求:
带了csrf参数,但是token不正确:
正确请求: