跨站请求伪造(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攻击会带来严重后果,一方面编写代码的时候使用优秀的框架,里面内置了安全防护措施和最佳实践,另外定期对网站进行安全审计,减少攻击的可能性。
热门推荐
13座副省级城市,为什么都打不过苏州?
阅读小说时,我们的意识在做什么?
乙烯利催熟香蕉:原理、安全性和经济效益全解析
男人减肥餐食谱一日三餐怎么吃?科学规划一日三餐!
绩效管理循环PDCA案例分析中,行动(Act)阶段如何进行改进?
湿气重,生百病!三味中药泡水喝,清热利湿,排出湿毒一身轻
物流公司如何选择:物流公司差异和3大选择重点
2024版高血压防治指南:14种降压药物使用要点全解析
开设加油站需要满足哪些条件?满足这些条件的难点在哪里?
Chrome浏览器如何管理来自不同网站的身份验证信息
一文带你搞懂看门狗
聚脲美缝剂与环氧彩砂全方位对比:选择最适合的家装美缝材料
购买二手笔记本电脑或台式机之前需要检查的 7 件事
全A情绪指数:市场对大事件的情绪反应
先吃菜肉后吃主食能减肥控糖?谁不适合这么吃?
血清游离轻链kappa/Lambda的临床意义,一文读懂
一文攻略法考!@2025年考生,关于法考你想知道的都在这里!
福利费一定要计入应付职工薪酬吗?速看会计分录
财务如何协助企业应对税务稽查?这些准备工作要提前做
左氧氟沙星片能喝酒吗
消防中级监控证书含金量高吗?
无糖饮料真的健康?小心胰岛素紊乱风险!
做私域运营,有哪些私域引流的方式?
渴望友谊的年纪:小学一年级孩子的社交发展
如何掌握日常工作管理方法和技巧,提升工作效率?
新加坡元对人民币汇率换算指南
美国警衔标志的法律地位与象征意义探析
岩板餐桌值得购买吗?岩板餐桌的缺点是什么?
各地广电网络公司纷纷接入DeepSeek,加速布局AI应用
室友打呼噜,床之间挂一个隔音棉有用吗?