Web安全SQL注入攻击详解1. SQL注入概述SQL注入是一种通过将恶意SQL代码插入到应用程序的SQL语句中从而操控数据库的攻击方式。2. SQL注入类型2.1 带内注入-- 用户输入: OR 11 SELECT * FROM users WHERE name OR 11 -- 联合查询注入 SELECT * FROM users WHERE id 1 UNION SELECT * FROM admin_users--2.2 盲注无法直接看到数据库输出通过条件判断推断数据-- 检查第一个字符 SELECT * FROM users WHERE id 1 AND ASCII(SUBSTRING(username,1,1)) 643. 防护措施3.1 参数化查询import github.com/jmoiron/sqlx // 参数化查询 func getUserByName(db *sqlx.DB, name string) (*User, error) { var user User // 使用占位符避免SQL注入 err : db.Get(user, SELECT * FROM users WHERE name ?, name) if err ! nil { return nil, err } return user, nil } // 批量查询 func getUsersByIDs(db *sqlx.DB, ids []int) ([]User, error) { query, args, err : sqlx.In(SELECT * FROM users WHERE id IN (?), ids) if err ! nil { return nil, err } query db.Rebind(query) var users []User err db.Select(users, query, args...) return users, err }3.2 ORM框架import gorm.io/gorm func getUserByNameGORM(db *gorm.DB, name string) (*User, error) { var user User // GORM自动使用参数化查询 result : db.Where(name ?, name).First(user) return user, result.Error }4. 输入验证import regexp func validateInput(input string) bool { // 白名单验证 matched, _ : regexp.MatchString(^[a-zA-Z0-9_]$, input) return matched } func searchUser(db *sqlx.DB, name string) ([]User, error) { if !validateInput(name) { return nil, errors.New(invalid input) } var users []User err : db.Select(users, SELECT * FROM users WHERE name LIKE ?, name%) return users, err }5. 数据库权限控制-- 创建只读用户 CREATE USER readonlylocalhost IDENTIFIED BY password; GRANT SELECT ON mydb.* TO readonlylocalhost; -- 创建应用用户仅DML权限 CREATE USER app_userlocalhost IDENTIFIED BY password; GRANT SELECT, INSERT, UPDATE, DELETE ON mydb.* TO app_userlocalhost;6. Web应用防火墙# ModSecurity规则示例 SecRule ARGS rx .*script.* \ id:1001,\ phase:2,\ deny,\ status:403,\ msg:Potential XSS Attack,\ logdata:%{ARGS},\ severity:27. 总结SQL注入是严重的Web安全漏洞防护措施包括参数化查询、输入验证、最小权限原则等。永远不要相信用户输入始终使用参数化查询。