Apabila menggunakan SQL dalam Golang, kadangkala perlu melepaskan data input untuk mengelakkan serangan suntikan SQL. Serangan suntikan SQL merujuk kepada penggodam yang membina pernyataan SQL yang berniat jahat untuk melaksanakan operasi yang tidak dibenarkan, seperti memadamkan pangkalan data, mengganggu data, dsb. Untuk mengelakkan serangan ini, kita perlu melarikan diri dari data yang dimasukkan oleh pengguna untuk memastikan data yang dimasukkan tidak mengandungi sebarang aksara yang menyalahi undang-undang.
Golang menyediakan beberapa fungsi terbina dalam yang boleh digunakan untuk melepaskan penyataan SQL. Yang paling biasa digunakan ialah fungsi db.QueryEscape()
. Fungsi ini mengambil hujah rentetan dan mengembalikan rentetan yang terlepas.
Berikut ialah contoh kod menggunakan fungsi db.QueryEscape()
:
import "database/sql" import _ "github.com/go-sql-driver/mysql" func main() { db, err := sql.Open("mysql", "user:password@/dbname") if err != nil { panic(err.Error()) } defer db.Close() var name string inputName := "Robert'; DROP TABLE students;--" err = db.QueryRow("SELECT name FROM students WHERE name=?", db.QueryEscape(inputName)).Scan(&name) if err != nil { panic(err.Error()) } fmt.Printf("The name is %s\n", name) }
Contoh di atas menanyakan pelajar dengan nama students
dalam jadual Robert'; DROP TABLE students;--
Nama ini mengandungi Pernyataan SQL yang berniat jahat, jika data input tidak terlepas, akan melaksanakan pernyataan DROP TABLE dan memadamkan keseluruhan jadual. Walau bagaimanapun, kerana kami menggunakan fungsi db.QueryEscape()
untuk melarikan diri, serangan suntikan SQL tidak akan berlaku.
Selain fungsi db.QueryEscape()
, terdapat beberapa fungsi melarikan diri lain, seperti db.Query(fmt.Sprintf("SELECT name FROM students WHERE name='%s'", strings.Replace(inputName, "'", "''", -1)))
, yang juga boleh melarikan diri dari pernyataan SQL. Walau bagaimanapun, kaedah ini adalah rumit dan terdedah kepada kesilapan.
Ringkasnya, sama ada anda menggunakan fungsi melarikan diri terbina dalam atau melarikan diri secara manual, pastikan data yang dimasukkan adalah selamat. Kerana jika data yang dimasukkan mempunyai kelemahan keselamatan, walaupun melarikan diri digunakan, ia akan meninggalkan peluang untuk penggodam.
Atas ialah kandungan terperinci Mari kita bincangkan tentang cara melepaskan penyataan SQL dalam golang. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!