跨站请求伪造(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攻击会带来严重后果,一方面编写代码的时候使用优秀的框架,里面内置了安全防护措施和最佳实践,另外定期对网站进行安全审计,减少攻击的可能性。
热门推荐
贵阳地铁S1号线,未来会开到未来方舟和东站吗?
合肥汽车站转型, 见证城市发展与变迁
R分析|怎么样使用piecewiseSEM构建结构方程模型?保姆级教程
科研学习|科研软件——如何使用SmartPLS软件进行结构方程建模
北方盐碱地向日葵种植技术详解
吃了甲硝唑能不能吃氯雷他定
三国杀武将攻略:界孙策吴
2024不按信号灯规定通行怎么处罚
消费降级也别踩坑:10 年闲鱼玩家的经验分享
签了电动车租赁合同后不想租了怎么办?
脑干:人体的生命活动中枢
头疼,眼睛疼是怎么回事,如何缓解
Korean friends,欢迎来到苏绣小镇~
如何训练数学逻辑思维能力
宜昌十大特色名小吃,探寻地道风味的美食之旅
城西站全方位指南:交通路线、设施服务、出行攻略及附近景点介绍
工伤期间奖金如何发放?一文详解工伤补助金领取流程
牡丹亭·惊梦·皂罗袍
羊肉和牛肉哪个蛋白质含量高
墙布发霉的条件及处理方法
整形医生张耐洋:解析泪沟的成因与改善方法
试管婴儿顺产风险揭秘:你需要知道的关键因素
怎么合理使用氟化钠
三伏天科学安全训练指南:从准备到恢复全方位防护
新债第一天上市的涨幅限制是多少,有以下3种情况
《暗黑破坏神:不朽》近战·苦痛与和谐武器伤害计算及测试分析
成都接连推出房贷新政 专家预计:下半年各地购房政策或将进一步宽松
NVLDDMKM.SYS蓝屏问题的详细解决方法
《黑神话:悟空》上线,国产3A大作“一鸣惊人”
惊变28周结局解析:结尾不明确的影片才更显的高大上