Maison >développement back-end >Golang >Comment utiliser la protection contre les injections SQL dans Golang ?

Comment utiliser la protection contre les injections SQL dans Golang ?

王林
王林original
2024-06-05 14:04:27853parcourir

Comment se défendre contre l'injection SQL : utilisez des requêtes paramétrées : utilisez les entrées utilisateur comme paramètres de la requête plutôt que de les inclure dans la chaîne de requête. Utilisation du package SQLX : utilisez la bibliothèque SQLX pour paramétrer les requêtes avec des requêtes nommées et des espaces réservés. Valider l'entrée : validez la validité de l'entrée utilisateur avant de l'utiliser dans une requête SQL.

如何在 Golang 中使用 SQL 注入防护?

Comment se défendre contre l'injection SQL dans Go

L'injection SQL est une vulnérabilité de sécurité courante des applications Web qui permet aux attaquants d'accéder ou de modifier des données non autorisées en modifiant les requêtes SQL. Pour empêcher l'injection SQL dans Go, vous pouvez suivre les étapes suivantes :

1. Utiliser des requêtes paramétrées

Les requêtes paramétrées prennent les entrées de l'utilisateur comme paramètres de la requête au lieu de les inclure directement dans la chaîne de requête. Cela empêche les attaquants de modifier la requête pour injecter du code malveillant.

Exemple :

import (
    "database/sql"
    "fmt"
)

func main() {
    db, err := sql.Open("mysql", "root:password@/database_name")
    if err != nil {
        panic(err)
    }
    defer db.Close()

    username := "username"
    stmt, err := db.Prepare("SELECT * FROM users WHERE username = ?")
    if err != nil {
        panic(err)
    }

    rows, err := stmt.Query(username)
    if err != nil {
        panic(err)
    }
    defer rows.Close()

    if !rows.Next() {
        fmt.Println("用户不存在。")
    }
}

2. Utilisation du package SQLX

SQLX est une bibliothèque Go qui fournit un moyen typé d'exécuter des requêtes SQL et d'empêcher l'injection SQL. Il utilise des requêtes nommées et des espaces réservés pour paramétrer les requêtes.

Exemple :

import (
    "database/sql"
    "fmt"

    "github.com/jmoiron/sqlx"
)

func main() {
    db, err := sql.Open("mysql", "root:password@/database_name")
    if err != nil {
        panic(err)
    }
    defer db.Close()

    dbx := sqlx.NewDb(db, "mysql")

    username := "username"
    stmt, err := dbx.PrepareNamed("SELECT * FROM users WHERE username = :username")
    if err != nil {
        panic(err)
    }

    rows, err := stmt.Queryx(map[string]interface{}{"username": username})
    if err != nil {
        panic(err)
    }
    defer rows.Close()

    if !rows.Next() {
        fmt.Println("用户不存在。")
    }
}

3. Valider la saisie

Vérifiez la validité de la saisie de l'utilisateur avant de l'utiliser dans une requête SQL. Assurez-vous que l'entrée est correctement formatée et ne contient aucun caractère malveillant.

Exemple :

func validateInput(input string) error {
    if len(input) > 100 || len(input) == 0 {
        return errors.New("无效的输入长度")
    }

    for _, r := range input {
        if !unicode.IsLetter(r) && !unicode.IsDigit(r) {
            return errors.New("无效的输入字符")
        }
    }

    return nil
}

En suivant ces étapes, vous pouvez contribuer à prévenir les vulnérabilités d'injection SQL et à rendre vos applications Web Go plus sécurisées.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn