SQL Injection
所谓 SQL 注入,就是通过客户端的输入把 SQL 命令注入到一个应用的数据库中,从而得以执行恶意 SQL 语句。
例子
uname = request.POST['username']
password = request.POST['password']
sql = "SELECT all FROM users WHERE username='" + uname + "' AND password='" + password + "'"
database.execute(sql)
上面这段程序直接将客户端传过来的数据写入到数据库。试想一下,如果用户传入的 password 值是: “password’ OR 1=1”,那么 sql 语句便会变成:
sql = "SELECT all FROM users WHERE username='username' AND password='password' OR 1=1"
那么,这句 sql 无论 username 和 password 是什么都会执行,从而将所有用户的信息取出来。
预防
执行的因素
想要提出解决方案,先看看 sql 注入得以施行的因素:
-
网页应用使用 SQL 来控制数据库
-
用户传入的数据直接被写入数据库
预防手段
可以参考 OWASP
-
Prepared Statements (with Parameterized Queries): 参数化的查询语句可以强制应用开发者首先定义所有的 sql 代码,之后再将每个参数传递给查询语句
-
Stored Procedures: 使用语言自带的存储程序,而不是自己直接操纵数据库
-
White List Input Validation: 验证用户的输入
-
Escaping All User Supplied Input: 对用户提供的所有的输入都进行编码
参考资料
https://zhuanlan.zhihu.com/p/23309154