什么是CSRF 攻击,怎样防御CSRF的攻击

什么是CSRF 攻击:

CSRF(Cross-site request forgery:跨站请求伪造)攻击是一种利用用户在已登录网站上的身份来伪造用户请求的攻击方式,造成用户数据的损失或网络安全的风险。也是一种挟制用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法

CSRF 攻击一般是攻击者通过某些手段,伪造用户请求,让用户在不知情的情况下,达到攻击者预期的目的,主要涉及以下步骤:

1. 攻击者获取用户已登录的 Cookie 信息。

2. 攻击者构造一些恶意代码,将这些代码注入到受害者的浏览器中。

3. 受害者在未经过任何提示的情况下,被恶意代码引导访问攻击者的网站,其中URL中包含了攻击者构造的恶意参数,如下所示:

<img src="http://vulnerable.com/api/delete?user_id=12345&profile_id=12345" style=”display: none;”>

4. 受害者浏览器访问攻击网站时,将自动向受害者之前已登录过的网站发送请求(上面存在的请求)。

5. 被恶意代码引导,受害者访问攻击者的网站,正在被他人攻击造成的后果并不为受害者所知,而浏览器会自动发送包含受害者的 Cookie 信息的请求,造成 CSRF 攻击。

当攻击者伪造了用户的请求后,服务器端将无法准确判断这个请求的合法性,导致用户数据被篡改、删除、操作等,产生极大的安全风险。因此,在设计 Web 应用程序时,需要充分考虑 CSRF 防御策略以保护用户的信息安全。

怎样防御CSRF的攻击

在 Golang Gin 中,可以用 中间件来进行 CSRF 防御。具体的使用方法如下:

  1. 安装 csrf 中间件包,可以使用命令 go get github.com/gin-contrib/csrf 进行安装,或者在代码中添加 import github.com/gin-contrib/csrf,Gin 框架会自动安装相关依赖。

  2. 在代码中使用 csrf 中间件,如下所示:

 
 
import (
    "github.com/gin-contrib/csrf"
    "github.com/gin-gonic/gin"
)

func main() {
    router := gin.Default()
    router.Use(csrf.Default())
    ...
}

3. 在 HTML 表单中添加 CSRF Token,使用 { { .csrfField }} 表示向用户输出 csrf token:

<form method="POST" action="/submit">
    {
   
   { .csrfField }}
    <input type="text" name="foo" value="bar">
    <button type="submit">提交</button>
</form>

4. 在处理 POST 请求的路由处理函数中,使用中间件提供的 csrf.CSRF(c) 方法,进行 CSRF Token 验证:

func submitHandler(c *gin.Context) {
    if !csrf.VerifyCSRFToken(csrfToken, csrfSecret, "") {
        c.AbortWithError(http.StatusForbidden, errors.New("CSRF 验证失败"))
        return
    }
    // 正常处理请求
    ...
}

其中,csrfToken 和 csrfSecret 分别对应前端表单中传入的 csrf token 和 csrf secret,可以通过 c.PostForm("csrf_token") 和 c.PostForm("csrf_secret") 来获取。

CSRF Secret 是一个加密密钥,用于加密和解密保存在 CSRF Token 中的数据,从而增强安全性。CSR Token 中包含了 CSRF Secret,因此在服务器端,可以使用相同的 CSRF Secret 从 CSRF Token 中解密出其中保存的数据。

在 Golang Gin 中,使用 csrf 中间件后,可以使用 func CSRF(c *gin.Context) bool 函数来验证 CSRF Token。该函数会获取提交的 CSRF Token,使用 CSRF Secret 来解密并比对其是否正确。如果响应结果为 true,则表明 CSRF Token 验证通过,否则表明被 CSRF 攻击。

需要注意的是,为了防止 CSRF 攻击,CSRF Secret 应该在服务器端保密,并且应该以某种随机的方式生成,且定期更新。在 Golang Gin 中,中间件会自动生成 CSRF Secret 并存储在 cookie 中,以便每次对 CSRF Token 进行验证时使用相同的 CSRF Secret。

func submitHandler(c *gin.Context) {
    if !csrf.CSRF(c) {
        c.AbortWithError(http.StatusForbidden, errors.New("CSRF 验证失败"))
        return
    }
    // 正常处理请求
    ...
}

通过以上步骤,可以在 Golang Gin 中很容易地使用 csrf 中间件进行 CSRF 防御。请注意,使用 CSRF Token 并不完美,必须结合其他安全措施一起使用才能更好地保护网站安全

猜你喜欢

转载自blog.csdn.net/canduecho/article/details/131003271