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.效果图:

 

posted @ 2020-09-29 17:51  孤舟残月浅笑嫣然  阅读(724)  评论(0编辑  收藏  举报