SQL 注入是一种常见的数据库攻击手段, SQL 注入漏洞也是网络世界中最普遍的漏洞之一。 SQL 注入就是恶意用户通过在表单中填写包含 SQL 关键字的数据来使数据库执行非常规代码的过程。
这个问题的来源就是, SQL 数据库的操作是通过 SQL 命令执行的,无论是执行代码还是数据项都必须卸载 SQL 语句中,这就导致如果我们在数据项中加入了某些 SQL 语句关键字(比如 SELECT,DROP等等),这些关键字就很可能在数据库写入或读取数据时得到执行。
- id := "031904102" + " AND 1=1 "
- where := "stu_number=" + id
- err := DB.Model(&User{}).Where(where).Find(&user).Error
- if err != nil {
- fmt.Println(err)
- }
如果使用上述代码的话进行字符串的拼接,就会导致 sql 注入的发生,本来是查询一条语句的,但是由于后面注入了 1 = 1 所以把数据库中的信息全部查出来了。
解决方法:使用占位符
- user2 := []User{}
- id := "156315775 ; drop table notice;"
- err = DB.Model(&User{}).Where("stu_number=?", id).Find(&user2).Error
- if err != nil {
- fmt.Println(err)
- }
最终的语句为:
SELECT * FROM `user` WHERE stu_number=031904102; drop table notice;
这条语句在 sql 中是可以执行的,但是在 gorm 框架中是不能执行的。
避免在操作数据库的时候使用字符串直接拼接的方式进行 SQL 查询。