防止CSRF跨域攻击

来源:互联网 发布:根据域名查询服务器 编辑:程序博客网 时间:2024/05/22 01:57

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不正确:

正确请求:


0 0