您的位置:首页 > 其它

防止CSRF跨域攻击

2015-07-29 17:42 716 查看
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不正确:



正确请求:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: