web安全问题-csrf

本文深入解析了跨站请求伪造(CSRF)攻击原理,展示了如何利用用户登录状态执行恶意操作,如资金转账、冒充用户发帖等,并提出了有效的防御措施,包括设置cookie属性、使用验证码、引入随机字符串token等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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']对比

转载于:https://www.cnblogs.com/weizaiyes/p/7723052.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值