65.9K
CodeProject 正在变化。 阅读更多。
Home

理解 CSRF:保护您的应用程序免受跨站请求伪造攻击的方法

emptyStarIconemptyStarIconemptyStarIconemptyStarIconemptyStarIcon

0/5 (0投票)

2024年8月29日

CPOL

2分钟阅读

viewsIcon

1353

跨站请求伪造 (CSRF) 是一种严重的安全漏洞,可能会危及您的 Web 应用程序。它会诱骗用户执行他们不打算执行的操作,通常会导致对网站进行未经授权的操作。

1. 什么是 CSRF,为什么您应该关注它?

Image
跨站请求伪造 (CSRF) 是一种攻击类型,其中恶意网站诱骗用户的浏览器向用户已通过身份验证的不同站点发出不必要的请求。 例如,如果用户已登录到他们的网上银行帐户,则 CSRF 攻击可能会诱骗他们的浏览器在他们不知情的情况下转账。

1.1 CSRF 攻击如何运作

  • 用户身份验证:用户登录到受信任的网站(例如,银行),并且他们的会话通过 cookie 维护。
  • 恶意网站:用户在仍然登录到受信任的站点时访问恶意网站。
  • 未经授权的请求:恶意站点使用经过身份验证的用户的凭据(通常通过 cookie)向受信任的站点发送请求。
示例:假设您已登录到您的网上银行帐户并访问恶意站点。 恶意站点可能包含如下所示的图像标签
<img src="https://bank.example.com/transfer?amount=1000&to=attacker" />
由于您已通过银行身份验证,因此将执行该请求,将资金转移到攻击者的帐户。

1.2 潜在后果

CSRF 攻击可能导致各种问题
  • 未经授权的交易:资金转移、更改帐户设置或执行其他敏感操作。
  • >数据盗窃:泄露个人或敏感数据。
  • 用户体验:损害用户信任并损害网站的声誉。

2. 防止 CSRF 攻击的方法

有效防御 CSRF 涉及实施各种安全措施,以确保请求来自合法的来源。

2.1 反 CSRF 令牌

防止 CSRF 攻击的最常见方法之一是使用反 CSRF 令牌。 这些是包含在每个表单或请求中的唯一令牌,必须由服务器验证。
示例
服务器端代码 (Spring Boot)
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) {
        // Validate the CSRF token
        if (!validateCsrfToken(csrfToken)) {
            throw new SecurityException("Invalid CSRF token");
        }
        // Perform money transfer
        return new ModelAndView("success");
    }

    private boolean validateCsrfToken(String token) {
        // Token validation logic
        return true;
    }
}
客户端代码 (HTML 表单)
<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.2 SameSite Cookie

另一种有效的措施是在 cookie 上设置 SameSite 属性。 这限制了 cookie 随跨站点请求发送的方式,从而增加了一层额外的保护。
示例
服务器端代码(Java 与 Servlet API)
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); // 1 hour
        csrfCookie.setSameSite("Strict"); // SameSite attribute
        response.addCookie(csrfCookie);
        // Continue processing
    }

    private String generateCsrfToken() {
        // Token generation logic
        return "generatedToken";
    }
}

2.3 Referer 标头验证

验证 Referer 标头可确保请求来自合法的来源。 这涉及检查传入请求的 Referer 标头,以确认它们来自预期的来源。
示例
服务器端代码(Node.js 与 Express)
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');
    }
    // Perform transfer
    res.send('Transfer successful');
});

3. CSRF 保护的其他技巧

3.1 使用安全框架

现代 Web 框架通常包含用于 CSRF 保护的内置机制。 确保您正在使用这些功能来保护您的应用程序。

3.2 定期安全审计

进行定期的安全审计,以识别和解决与 CSRF 和其他威胁相关的潜在漏洞。

4. 结论

跨站请求伪造 (CSRF) 攻击可能会对 Web 应用程序造成严重后果。 通过实施反 CSRF 令牌、利用 SameSite cookie 以及验证 referer 标头,您可以显著增强应用程序的安全性。 请记住使用安全框架,教育您的团队,并进行定期安全审计,以领先于潜在威胁。
如果您有任何问题或需要进一步澄清 CSRF 保护方法,请随时在下面留下评论!

阅读更多帖子:: 理解 CSRF:保护您的应用程序免受跨站请求伪造的方法

© . All rights reserved.