跨站请求伪造(CSRF)攻击及其防御措施
创作时间:
作者:
@小白创作中心
跨站请求伪造(CSRF)攻击及其防御措施
引用
CSDN
1.
https://m.blog.csdn.net/qq_44005305/article/details/145964850
CSRF攻击及其防御措施
跨站请求伪造(CSRF)是一种严重的安全漏洞,会危及网络应用。它诱使用户执行他们并不打算执行的操作,从而导致网站上出现未经授权的操作。
CSRF是什么?
CSRF是一种攻击类型,恶意网站会诱骗用户的浏览器向用户 已通过身份验证的不同网站 发出不必要的请求。例如,如果用户登录了自己的网上银行账户,CSRF攻击就会诱使浏览器在用户不知情的情况下转移资金。
CSRF是如何工作的
1: CSRF攻击步骤
- 用户验证:用户登录受信任的网站(如银行系统),通过cookie维持会话,这一步只有用户才能操作,这是攻击的前提。
- 恶意网站:黑客通过各种方式 诱骗 用户在不知情的情况下访问恶意网站。
- 未经授权的请求:恶意网站使用已认证用户的凭据(通常通过cookie)向受信任网站发送请求,这个请求被精心设计,以在受信任网站上执行操作,而用户对此并不知情或未经同意。
恶意网站的程序可能就是一张图片:
<img src="https://bank.example.com/transfer?amount=1000&to=attacker" />
图片中的脚本就会执行JavaScript脚本,携带受信任的网站的Cookie向受信任的网站发送请求。
2: 如何诱骗用户访问恶意网站
攻击的 核心 就是如何 诱骗 用户在不知情的情况下访问恶意网站,大概的方式如下:
- 钓鱼邮件
- 被种植木马的第三方网站
- 社交媒体上的恶意连接
核心的核心就是要触发访问恶意网站,不管是显示点击还是隐式访问。
CSRF的危害
- 未经授权的交易:转移资金、更改账户设置或执行其他敏感操作。
- 数据窃取:窃取个人或敏感数据,比如口令等。
- 用户体验:破坏用户信任,损害网站声誉。
如何避免CSRF攻击
所谓跨站攻击,且使用第三方网站诱骗,那涉及到跨域的问题,大部分解决方案业缘于此。
1: Anti-CSRF Tokens
在请求表单中包含一个唯一的、不可预测的令牌,并在服务器端验证该令牌。
服务器端代码:
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.stereotype.Controller;
import org.springframework.web.servlet.ModelAndView;
@Controller
public class TransferController {
@PostMapping("/transfer")
public ModelAndView transferMoney(@RequestParam("amount") int amount, @RequestParam("to") String to, @RequestParam("csrfToken") String csrfToken) {
if (!validateCsrfToken(csrfToken)) {
throw new SecurityException("Invalid CSRF token");
}
return new ModelAndView("success");
}
private boolean validateCsrfToken(String token) {
return true;
}
}
客户端代码:
<form action="/transfer" method="post">
<input type="hidden" name="csrfToken" value="${csrfToken}">
<input type="number" name="amount" placeholder="Amount">
<input type="text" name="to" placeholder="Recipient">
<button type="submit">Transfer</button>
</form>
2: SameSite Cookies
Cookie同源策略的限制,SameSite
是一个用于控制浏览器在跨站请求中发送cookie的属性,可以设置为以下三个值:
- Strict:只有在同一站点的请求中才会发送cookie。
- Lax:允许同一站点的请求发送cookie,并且在某些跨站请求中也会发送cookie,比如从外部站点点击链接允许,Ajax请求不允许。
- None:默认允许执行所有跨站请求。
服务器端代码:
import javax.servlet.http.Cookie;
public class MyServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Cookie csrfCookie = new Cookie("csrfToken", generateCsrfToken());
csrfCookie.setHttpOnly(true);
csrfCookie.setSecure(true);
csrfCookie.setPath("/");
csrfCookie.setMaxAge(3600);
csrfCookie.setSameSite("Strict"); // SameSite attribute
response.addCookie(csrfCookie);
}
private String generateCsrfToken() {
return "generatedToken";
}
}
3: Referer Header 校验
这也是一种方式,不过很容易伪造。
const express = require('express');
const app = express();
app.post('/transfer', (req, res) => {
const referer = req.headers.referer;
if (!referer || !referer.startsWith('https://yourwebsite.com')) {
return res.status(403).send('Forbidden');
}
res.send('Transfer successful');
});
CSRF攻击会带来严重后果,一方面编写代码的时候使用优秀的框架,里面内置了安全防护措施和最佳实践,另外定期对网站进行安全审计,减少攻击的可能性。
热门推荐
青香蕉可以做面粉?不仅减少剩食、含抗性淀粉还能增加饱腹感!
槐角的功效与作用
开源的2.5G光猫
手机键盘皮肤更换指南:从安卓到iOS的全面教程
入选《科学》2024十大科学突破,这一成果离不开上海科学家贡献
EDG新阵容定了!上单ZDZ,下路Assum!粉丝吐槽:比赛都不想看了
准备移栽的茄子幼苗和黄瓜幼苗为什么都带个土团
咖啡萃取的那些事 萃取与萃取平衡
服用琥珀酸美托洛尔缓释片期间能否饮酒?
《哪吒之魔童闹海》中的“陕西制作”
《周易》可以预判股市吗?探寻股市预测的古老奥秘
肺小结节病理报告看不懂?一分钟时间为您解读
怎么治疗胸椎间盘突出症
一文读懂:智算中心光互联技术发展现状与未来趋势
清凉油不只有止痒:探索它的用途
如何通过政府网站查询车辆违章记录
宝宝发烧可以泡脚吗?专业医生这样建议
利用抗核抗体-药物结合物开发出抗核导弹癌症疗法
探秘帝俊的身世:神话中的天神之子
63岁刘德华,突传喜讯!
金价跌势不止?专家分析与关键技术位揭示:黄金市场的未来走向
国债逆回购可以提前取出吗?
辅助驾驶系统误识别广告牌上车辆,急刹致追尾被判全责!理想汽车回应
AIGC绘画设计基础:SD人物写实图像高质量生成和手部修复
员工退休怎么办理手续
二战德国巅峰时期有多强大?仅仅是陆军德国就超过日军50倍左右。
口腔异味难以去除?了解口臭的根源及有效的治疗方法
紫藤花的种植方法和注意事项
换帅前华为悍将,荣耀加速全球化进程
气膜结构:为稀土材料储存提供创新解决方案