web安全问题-csrf
2023-02-18 16:29:45 时间
web安全问题 csrf
<script>
document.write(`
<form name="commentForm" target="csrf" method="post" action="http://localhost:1521/post/addComment">
<input name="postId" type="hidden" value="13">
<textarea name="content">来自csrf</textarea>
</form>
`
);
var iframe = document.createElement('iframe');
iframe.name = 'csrf';
iframe.style.display = 'none';
document.body.appendChild(iframe);
setTimeout(function(){
document.querySelector('[name=commentForm]').submit();
},1000)
</script>
<img src="http://localhost:1521/ajax/addComment?postId=13&content=123123">
<a href="http://localhost:1521/ajax/addComment?postId=13&content=123123"></a>
1.原理
用户登录A网站 - A网站确认身份 - B网站向A网站发起请求(带A网站身份)
cookie会保留在网页中
2.CSRF攻击危害
- 利用用户登录状态 (盗取用户资金 转账消费)
- 用户不知情 (冒充用户发帖背锅)
- 完成业务请求 (损坏网站声誉)
www.a.com前端 <=> www.a.com后端
www.b.com前端 => www.a.com后端
B网站向A网站请求带A网站Cookies 不访问A网站前端 refer为B网站
csrf防御攻击
1.cookies进行设置 只是chrome支持
sameSite: 'strict'
2.在前端页面加入验证信息
3.验证码 (前后端 图形验证码会降低用户体验)
4.token 随机字符串
- 必须经过目标网站前端才能获取token
token
var csrfToken = parseInt(Math.random()*999999,10);
cookies.set('csrfToken',csrfToken); //放到cookies
this->ajaxReturn('要有token')
前台不用显示 hidden
post的时候校验
post的token 和 cookie里面的token
如果是ajax请求
<meta name="csrf_token" content="">
js获取之后在后台跟cookies里面的值对比
用户打开很多窗口 提交在前面的token 只有最后一个表单可以成功提交 token在cookie中只有一个
解决方法
$_SESSION['SESSION_KEY.$form_name']
判断refer
var refer = request.headers.referer
if(!/^https?\/\/localhost/.test(referer)){
throw new Error()
}
php防御CSRF
1.Cookie sameSite属性
2.HTTP refer头
<?php
//获取referer头
if($_SERVER['HTTP_REFERER']){
$isLegal = strpos($_SERVER['HTTP_REFERER'],'http://websecurity.local/') === 0;
var_dump($isLegal);
}
3.token 一份给cookie 一份给表单
$csrfToken = "1231321";
setcookie('csrfToken',$csrfToken);
$_POST['csrfToken'] $_COOKIE['csrfToken']对比
相关文章
- 塞翁失马,焉知非福:由 Styles.Render 所引发 runAllManagedModulesForAllRequests="true" 的思考
- DDD 领域驱动设计-三个问题思考实体和值对象
- 关于有默认值的字段在用EF做插入操作时的思考(续)
- Repository 仓储,你的归宿究竟在哪?(二)-这样的应用层代码,你能接受吗?
- DDD 领域驱动设计-Value Object(值对象)如何使用 EF 进行正确映射
- 醍醐灌顶:领域驱动设计实现之路
- DevExpress控件安装、汉化使用教程
- 小菜的程序员道路(三)
- RabbitMQ 消息顺序、消息幂等、消息重复、消息事务、集群
- DDD 领域驱动设计-如何控制业务流程?
- ASP.NET 5 Target framework dnx451 and dnxcore50
- 深入探讨:标签(Tag)的各种设计方案
- IDDD 实现领域驱动设计-一个简单的 CQRS 示例
- 【AutoMapper官方文档】DTO与Domin Model相互转换(中)
- 我的编程开始(C)
- Docker 搭建 etcd 集群
- Mac OS 使用 Vagrant 管理虚拟机(VirtualBox)
- K & DN 的前世今生(微软开源命名变革)
- IDDD 实现领域驱动设计-一个简单业务用例的回顾和理解
- Building Modern Web Apps-构建现代的 Web 应用程序(一些感想)