php防止CSRF(跨站请求伪造)的原理实现示例
1.前端页面(index.php):
<?php /** * 前端页面 */ session_start(); //生成随机字符串 function randomStr($max = 16){ $str = 'abcdefghijklmnopqrstuvwxyz'. '0123456789'. 'ABCDEFJHIJKLMNOPQRSTUVWXYZ'; $val = ''; $str = str_shuffle($str); //打乱字符串 for($i = 0; $i < $max; $i++){ $val .= $str[rand(0, strlen($str) - 1)]; } return $val; } $_SESSION['token'] = randomStr(); //此函数给URL重写机制添加名/值对。 //此函数要写在 html 页面前端中;如果是 MVC 模式,应包含在 view 视图文件内 output_add_rewrite_var('token', $_SESSION['token']); include_once 'view.php'; print_r(ob_list_handlers());
2.后端页面(form.php):
<?php /** * 后端页面 */ session_start(); echo '原始的值:'.$_SESSION['token'].'<br>收到的值:'.$_POST['token'].'<br>'; //服务端判断 token 后执行 if(filter_has_var(INPUT_POST, "token") && $_POST['token'] == $_SESSION['token']){ // 这是防 CSRF 后接收到的数据 echo '<strong style="color:red">安全地收到数据了!内容为:'.$_POST['var2'].'</strong><br>'; } print_r(ob_list_handlers());
3.视图页面(view.php):
<div> <a href="file.php">link</a> <a href="http://example.com">link2</a> <form action="form.php" method="post"> <input type="text" name="var2" value="这是默认值!"/> <input type="submit" value="确定"> </form> </div>
4.效果图: