Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Menggunakan rangka kerja Gin untuk melaksanakan fungsi perlindungan keselamatan web

Menggunakan rangka kerja Gin untuk melaksanakan fungsi perlindungan keselamatan web

WBOY
WBOYasal
2023-06-22 23:25:351306semak imbas

Dengan populariti Internet, aplikasi Web telah menjadi bahagian yang amat diperlukan dalam kehidupan dan kerja kita. Walau bagaimanapun, isu keselamatan sentiasa menjadi cabaran besar untuk aplikasi Web. Isu keselamatan web termasuk suntikan SQL, serangan skrip merentas tapak, akses tanpa kebenaran, dsb. Risiko keselamatan ini boleh membawa kepada kebocoran data sulit atau bahkan kawalan penuh ke atas pelayan. Untuk menyelesaikan masalah keselamatan web ini, kami boleh menggunakan fungsi perlindungan keselamatan web yang disediakan oleh rangka kerja Gin.

Gin ialah rangka kerja web bahasa Go yang ringan yang menyediakan keupayaan untuk membina aplikasi web berprestasi tinggi dengan cepat. Pada masa yang sama, rangka kerja Gin juga menyediakan banyak fungsi berkaitan keselamatan web, yang penggunaannya boleh meningkatkan keselamatan aplikasi web dengan ketara.

  1. Gunakan protokol HTTPS

HTTPS ialah protokol HTTP berdasarkan protokol komunikasi yang disulitkan TLS/SSL. Ia melindungi proses komunikasi aplikasi web dengan menggunakan teknologi penyulitan kunci awam dan peribadi untuk mengelakkan kecurian atau gangguan data. Jika anda ingin menggunakan protokol HTTPS dalam aplikasi web anda, anda boleh mengubah hala secara automatik permintaan HTTP ke protokol HTTPS melalui perisian tengah yang disediakan oleh rangka kerja Gin.

Pertama, anda perlu menjana sijil yang ditandatangani sendiri dalam pelayan. Kemudian, gunakan kod berikut untuk mendayakan perisian tengah rangka kerja Gin:

func main() {
    r := gin.Default()
    r.Use(TLSHandler())
    ...
    r.Run(":443")
}

func TLSHandler() gin.HandlerFunc {
    return func(c *gin.Context) {
        if c.Request.TLS == nil || len(c.Request.TLS.PeerCertificates) == 0 {
            loc, err := time.LoadLocation("Asia/Shanghai")
            if err != nil {
                loc = time.FixedZone("Asia/Shanghai", 8*60*60)
            }
            c.Redirect(http.StatusMovedPermanently, "https://"+c.Request.Host+c.Request.URL.Path)
            return
        }
    }
}

Perisian tengah ini akan menyemak sama ada permintaan menggunakan protokol TLS. Jika tidak digunakan, ia akan mengubah hala ke protokol HTTPS melalui HTTP 301.

  1. Cegah SQL Injection

SQL injection ialah kaedah serangan yang mengeksploitasi kelemahan aplikasi web Penyerang boleh memasukkan kod SQL berniat jahat untuk mengusik atau mencuri data pangkalan data. Untuk mengelakkan serangan suntikan SQL, kami boleh menggunakan alat sokongan rasmi GORM rangka kerja Gin, yang menyediakan banyak langkah perlindungan keselamatan untuk akses pangkalan data, seperti penggunaan pernyataan yang disediakan, pengikatan parameter, pelarian automatik, dsb.

Berikut ialah contoh kod untuk rangka kerja Gin untuk menggunakan penyataan prapenyusun GORM:

func main() {
    db, err := gorm.Open("sqlite3", "test.db")
    if err != nil {
        panic(err.Error())
    }

    db.DB().SetMaxIdleConns(10)
    db.DB().SetMaxOpenConns(100)

    r := gin.Default()

    r.GET("/user/:id", func(c *gin.Context) {
        var user User
        if err := db.Where("id = ?", c.Param("id")).First(&user).Error; err != nil {
            c.AbortWithStatus(http.StatusNotFound)
            return
        }
        c.JSON(http.StatusOK, user)
    })

    r.Run(":8080")
}

Dalam kod di atas, rangka kerja Gin menggunakan penyataan prapenyusun semasa melaksanakan pertanyaan SQL melalui kaedah yang disediakan oleh GORM , dan Ikat parameter pada rentetan pertanyaan. Ini menjadikan serangan suntikan SQL lebih sukar.

  1. Halang serangan skrip merentas tapak

Skrip merentas tapak (XSS) ialah kaedah serangan di mana penyerang mengeksploitasi kelemahan keselamatan dalam aplikasi web untuk menyuntik Kod berniat jahat dilaksanakan untuk mendapatkan maklumat sensitif pengguna. Untuk mengelakkan serangan XSS, kita boleh menggunakan perisian tengah CSRF yang disediakan oleh rangka kerja Gin.

Perisian tengah CSRF akan menyemak semua permintaan HTTP POST yang mengandungi medan borang untuk memastikan bahawa ia adalah parameter selamat daripada rangka kerja Gin. Jika permintaan tidak mengandungi parameter keselamatan yang sah, perisian tengah CSRF akan membuang pengecualian kod status HTTP 403.

Berikut ialah contoh kod menggunakan perisian tengah CSRF rangka kerja Gin:

func main() {
    r := gin.Default()

    csrf := csrf.New(csrf.Options{
        Secret: "krCXcjS0n7vPDS2HaBw00lDWGCQujCn7",
    })

    r.Use(csrf)

    r.POST("/sign", func(c *gin.Context) {
        username := c.PostForm("username")
        password := c.PostForm("password")
        c.JSON(http.StatusOK, gin.H{"message": "登录成功", "username": username, "password": password})
    })

    r.Run(":8080")
}

Dalam kod di atas, rangka kerja Gin menggunakan perisian tengah CSRF dan menetapkan kunci sebagai parameter keselamatan. Apabila pengguna menyerahkan permintaan borang, perisian tengah CSRF akan menyemak dan mengesahkan parameter keselamatan secara automatik untuk memastikan bahawa data dilindungi dengan berkesan semasa penghantaran.

  1. Halang akses tanpa kebenaran

Akses tanpa kebenaran ialah kaedah serangan, iaitu penyerang mengeksploitasi kelemahan keselamatan dalam aplikasi web untuk mendapatkan akses tanpa kebenaran dan kemudian melakukan operasi hasad . Untuk menghalang akses tanpa kebenaran, kami boleh menggunakan perisian tengah pengesahan JWT (JSON Web Token) dalam rangka kerja Gin.

JWT ialah protokol pengesahan berdasarkan struktur data JSON Ia memastikan keselamatan data dan anti-pendengaran dengan menghantar maklumat keselamatan antara pelanggan dan pelayan. Apabila menggunakan perisian tengah JWT, kita perlu menggunakan kunci rahsia untuk menandatangani semua token yang dijana. Apabila pengguna mengesahkan, middleware mengesahkan bahawa mereka dibenarkan dengan mengesahkan token.

Berikut ialah kod sampel menggunakan perisian tengah pengesahan JWT rangka kerja Gin:

func main() {
    r := gin.Default()

    var db *gorm.DB // 定义数据库

    authMiddleware := &jwt.GinJWTMiddleware{
        Realm:       "test zone",
        Key:         []byte("krCXcjS0n7vPDS2HaBw00lDWGCQujCn7"),
        Timeout:     time.Hour,
        MaxRefresh:  time.Hour,
        Authenticator: func(userId string, password string, c *gin.Context) (interface{}, error) {
            var user User
            if err := db.Where("username = ? AND password = ?", userId, password).First(&user).Error; err != nil {
                return nil, fmt.Errorf("用户名或密码错误")
            }
            return &user, nil
        },
        Authorizator: func(data interface{}, c *gin.Context) bool {
            if v, ok := data.(*User); ok && v.UserName == "admin" {
                return true
            }
            return false
        },
        Unauthorized: func(c *gin.Context, code int, message string) {
            c.JSON(code, gin.H{"code": http.StatusUnauthorized, "message": message})
        },
        TokenLookup: "header: Authorization, query: token, cookie: jwt",
        TokenHeadName: "Bearer",
        TimeFunc: time.Now,
    }

    r.Use(authMiddleware.MiddlewareFunc())

    r.POST("/login", authMiddleware.LoginHandler)

    r.GET("/admin", authMiddleware.MiddlewareFunc(), func(c *gin.Context) {
        c.JSON(http.StatusOK, gin.H{"message": "管理员页面"})
    })

    r.Run(":8080")
}

Dalam kod di atas, rangka kerja Gin menggunakan perisian tengah pengesahan JWT dan mentakrifkan pangkalan data yang Disahkan. Apabila pengguna menyerahkan bukti identiti yang sah, perisian tengah JWT memanggil fungsi "Authenticator" untuk mengesahkan bahawa mereka diberi kuasa secukupnya. Apabila token tamat tempoh, middleware JWT secara automatik menyegarkan token menggunakan pilihan "MaxRefresh".

Ringkasan

Isu keselamatan web adalah salah satu masalah utama yang dihadapi oleh aplikasi Internet. Untuk memastikan keselamatan aplikasi web, kami boleh menggunakan banyak pemalam perlindungan keselamatan web yang disediakan oleh rangka kerja Gin. Sama ada ia menghalang suntikan SQL, menghalang serangan skrip merentas tapak atau menghalang akses tanpa kebenaran, perisian tengah yang disediakan oleh rangka kerja Gin boleh membantu kami mengurangkan risiko keselamatan dan memberikan perlindungan pengguna yang lebih tinggi dalam aplikasi.

Atas ialah kandungan terperinci Menggunakan rangka kerja Gin untuk melaksanakan fungsi perlindungan keselamatan web. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn