sql >> Databáze >  >> RDS >> Mysql

vytváření dynamického dotazu v mysql a golang

Chcete-li odpovědět na vaši otázku, jak formátovat řetězec, jednoduchou odpovědí je použít fmt.Sprintf strukturovat váš řetězec. Nicméně viz dále níže pro rychlou poznámku o použití fmt.Sprintf pro dotazy db:

Příklad:

query := fmt.Sprintf("SELECT id FROM users WHERE login='%s'", login)
err = db.Query(query)

// Equivalent to:
rows, err := db.Query("SELECT id FROM users WHERE login=?", login)

Když to použijete pro dotazy, jste v bezpečí před injekcemi. Jak již bylo řečeno, můžete být v pokušení toto upravit a použít db.Exec také pro vytváření/aktualizace/mazání. Obecně platí, že pokud používáte db.Exec s fmt.Sprintf a své vstupy nejprve nedezinfikujete, otevíráte se injekcím sql .

GoPlay s jednoduchým příkladem, proč je fmt.Sprintf s db.Exec špatný:
https://play.golang.org/p/-IWyymAg_Q

Měli byste použít db.Query nebo db.Prepare vhodným způsobem, aby se zabránilo těmto druhům útočných vektorů. Možná budete muset upravit výše uvedený ukázkový kód, abyste vytvořili fragment bezpečný pro injekci, ale doufám, že jsem vám dal dost, abyste mohli začít.




  1. nastavení mamp portů na 80 a 3306

  2. 2 způsoby, jak získat výchozí jazyk přihlášení na SQL Server (T-SQL)

  3. Jak přidat 1 k hodnotě sloupce existujícího řádku v mysql

  4. Ekvivalent návratové klauzule Mysql