我们任何时候都不应该自己拼接SQL语句!
sqlInjectDemo("xxx‘ or 1=1#") sqlInjectDemo("xxx‘ union select * from user #") sqlInjectDemo("xxx‘ and (select count(*) from user) <10 #")
package main import ( "fmt" "github.com/jmoiron/sqlx" _ "github.com/go-sql-driver/mysql" // init() ) // Go连接MySQL示例 var db *sqlx.DB // 是一个连接池对象 func initDB() (err error) { // 数据库信息 // 用户名:密码@tcp(ip:端口)/数据库的名字 dsn := "root:[email protected](127.0.0.1:3306)/sql_test" // 连接数据库 db, err = sqlx.Connect("mysql", dsn) if err != nil { return } db.SetMaxOpenConns(10) // 设置数据库连接池的最大连接数 db.SetMaxIdleConns(5) // 设置最大空闲连接数 return } type user struct { ID int Name string Age int } // SQL注入 // sql注入示例 func sqlInjectDemo(name string) { // 自己拼接SQL语句的字符串 sqlStr := fmt.Sprintf("select id, name, age from user where name=‘%s‘", name) fmt.Printf("SQL:%sn", sqlStr) var users []user err := db.Select(&users, sqlStr) if err != nil { fmt.Printf("exec failed, err:%vn", err) return } for _, u := range users { fmt.Printf("user:%#vn", u) } } func main() { err := initDB() if err != nil { fmt.Printf("init DB failed, err:%vn", err) return } // SQL注入的几种示例 // sqlInjectDemo("xxx‘ or 1=1 #") sqlInjectDemo("xxx‘ union select * from user #") }