新聞中心
跨站請(qǐng)求偽造(英語:?Cross-Site Request Forgery?),也被稱為 ?one-click attack? 或者 ?session riding?,通??s寫為 ?CSRF ?或者 ?XSRF?, 是一種挾制用戶在當(dāng)前已登錄的?Web?應(yīng)用程序上執(zhí)行非本意的操作的攻擊方法。跟跨網(wǎng)站腳本(?XSS?)相比,?XSS?利用的是用戶對(duì)指定網(wǎng)站的信任,?CSRF ?利用的是網(wǎng)站對(duì)用戶網(wǎng)頁(yè)瀏覽器的信任。

成都創(chuàng)新互聯(lián)網(wǎng)站建設(shè)公司一直秉承“誠(chéng)信做人,踏實(shí)做事”的原則,不欺瞞客戶,是我們最起碼的底線! 以服務(wù)為基礎(chǔ),以質(zhì)量求生存,以技術(shù)求發(fā)展,成交一個(gè)客戶多一個(gè)朋友!專注中小微企業(yè)官網(wǎng)定制,成都網(wǎng)站制作、成都網(wǎng)站設(shè)計(jì),塑造企業(yè)網(wǎng)絡(luò)形象打造互聯(lián)網(wǎng)企業(yè)效應(yīng)。
如何防御
這里我們選擇通過?token?的方式對(duì)請(qǐng)求進(jìn)行校驗(yàn),通過中間件的方式實(shí)現(xiàn),?CSRF?跨站點(diǎn)防御插件由社區(qū)包提供。
開發(fā)者可以通過對(duì)接口添加中間件的方式,增加?token?校驗(yàn)功能。
感興趣的朋友可以閱讀插件源碼 https://github.com/GOgf/csrf
使用方式
引入插件包
import "github.com/gogf/csrf"
配置接口中間件
?csrf?插件支持自定義?csrf.Config?配置,?Config?中的?Cookie.Name?是中間件設(shè)置到請(qǐng)求返回?Cookie?中?token?的名稱,?ExpireTime?是?token?超時(shí)時(shí)間,?TokenLength?是?token?長(zhǎng)度,?TokenRequestKey?是后續(xù)請(qǐng)求需求帶上的參數(shù)名。
s := g.Server()
s.Group("/api.v2", func(group *ghttp.RouterGroup) {
group.Middleware(csrf.NewWithCfg(csrf.Config{
Cookie: &http.Cookie{
Name: "_csrf",// token name in cookie
},
ExpireTime: time.Hour * 24,
TokenLength: 32,
TokenRequestKey: "X-Token",// use this key to read token in request param
}))
group.ALL("/csrf", func(r *ghttp.Request) {
r.Response.Writeln(r.Method + ": " + r.RequestURI)
})
})
前端對(duì)接
通過配置后,前端在?POST?請(qǐng)求前從?Cookie?中讀取?_csrf?的值(即?token?),然后請(qǐng)求發(fā)出時(shí)將?token?以?X-Token?(?TokenRequestKey?所設(shè)置)參數(shù)名置入請(qǐng)求中(可以是?Header?或者?Form?)即可通過?token?校驗(yàn)。
代碼示例
使用默認(rèn)配置
package main
import (
"net/http"
"time"
"github.com/gogf/csrf"
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/net/ghttp"
)
// default cfg
func main() {
s := g.Server()
s.Group("/api.v2", func(group *ghttp.RouterGroup) {
group.Middleware(csrf.New())
group.ALL("/csrf", func(r *ghttp.Request) {
r.Response.Writeln(r.Method + ": " + r.RequestURI)
})
})
s.SetPort(8199)
s.Run()
}
使用自定義配置
package main
import (
"net/http"
"time"
"github.com/gogf/csrf"
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/net/ghttp"
)
// set cfg
func main() {
s := g.Server()
s.Group("/api.v2", func(group *ghttp.RouterGroup) {
group.Middleware(csrf.NewWithCfg(csrf.Config{
Cookie: &http.Cookie{
Name: "_csrf",// token name in cookie
Secure: true,
SameSite: http.SameSiteNoneMode,// 自定義samesite
},
ExpireTime: time.Hour * 24,
TokenLength: 32,
TokenRequestKey: "X-Token",// use this key to read token in request param
}))
group.ALL("/csrf", func(r *ghttp.Request) {
r.Response.Writeln(r.Method + ": " + r.RequestURI)
})
})
s.SetPort(8199)
s.Run()
} 分享標(biāo)題:創(chuàng)新互聯(lián)GoFrame教程:GoFrame高級(jí)特性-CSRF防御設(shè)置
標(biāo)題來源:http://www.dlmjj.cn/article/dppegid.html


咨詢
建站咨詢
