CSRF的安全问题

利用场景:后台存在添加管理员的功能,如下:

进行抓包观察,发现成功抓包

那么为了防止类似的CSRF攻击的话,肯定需要进行防御措施:

1、验证请求是否token合法

2、判断请求的来源是否合法


token验证:

<script type="text/javascript">
function login() {
var token = "{$token}"
$.post("/index.php?m=index&a=add", {
username: $("#username").val(),
password: $("#password").val(),
token: token,
}, function (data) {
if (data.status == 1) {
window.location.href = data.data.url
} else {
alert(data.msg)
}
}, 'json');
}
</script>
$username = isset($_POST['username']) ? $_POST['username'] : '';
$password = isset($_POST['password']) ? $_POST['password'] : '';
$token = isset($_POST['token']) ? $_POST['token'] : '';
if(empty($username)) {$this->json(['status'=>0,'msg'=>'账户不能为空!']);unset($_SESSION['token']);}
if(empty($password)) {$this->json(['status'=>0,'msg'=>'密码不能为空!']);unset($_SESSION['token']);}
if(empty($token)) {$this->json(['status'=>0,'msg'=>'token异常!']);unset($_SESSION['token']);}
if($token != $_SESSION['token']){
$this->json(['status'=>0,'msg'=>'token异常!']);
}
//防止token重用需要进行删除
unset($_SESSION['token']);

重新进行抓包,如下,发现添加成功

如果删除token的话再次测试,添加失败


判断请求的来源是否合法: $_SERVER["HTTP_REFERER"]

实现代码:

$referer = $_SERVER["HTTP_REFERER"];
if(!preg_match('~http://smarty.com\/.*~',$referer,$a)){
unset($_SESSION['token']);
$this->json(['status'=>0,'msg'=>'非法请求']);
}
$username = isset($_POST['username']) ? $_POST['username'] : '';
$password = isset($_POST['password']) ? $_POST['password'] : '';
$token = isset($_POST['token']) ? $_POST['token'] : '';
if(empty($username)) {$this->json(['status'=>0,'msg'=>'账户不能为空!']);unset($_SESSION['token']);}
if(empty($password)) {$this->json(['status'=>0,'msg'=>'密码不能为空!']);unset($_SESSION['token']);}
if(empty($token)) {$this->json(['status'=>0,'msg'=>'token异常!']);unset($_SESSION['token']);}
if($token != $_SESSION['token']){
unset($_SESSION['token']);
$this->json(['status'=>0,'msg'=>'token异常!']);
}
//防止token重用需要进行删除
unset($_SESSION['token']);

posted @   zpchcbd  阅读(370)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
点击右上角即可分享
微信分享提示