推荐教材:
《Python程序设计基础与应用》(ISBN:9787111606178),董付国,机械工业出版社
图书详情:
用书教师可以联系董老师获取教学大纲、课件、源码、电子教案、考试系统等配套教学资源。
SQL注入是一种常见的攻击手法,主要实现方式是通过提供精心构造的数据使得在服务端拼接成具有恶意的SQL语句,可以实现万能登录、暴漏数据库和数据表结构、执行存储过程甚至获取超级管理员权限等,具有非常大的威胁,曾经是黑客非常常用的技术,常见于WEB网站的攻击,桌面程序也存在类似的攻击面。
例如,假设在登录界面的代码中分别使用user_name和pass_word获取用户输入的用户名和密码,然后使用下面的代码拼接SQL语句,试图返回数据表中以user_name为用户名且以pass_word为密码的记录数量,如果查询结果为0表示输入不正确,
sql = f'select count(username) from users where username="{user_name}" and password="{pass_word}"'
如果用户在登录时提交
user_name = 'admin'
和
pass_word = '1" or 1=1--'
,那么上面的SQL将被拼接为
'select count(username) from users where username="admin" and password="1" or 1=1--"'
在SQL语句中“--”表示注释,后面的代码不会被执行,如此一来,语句中where的条件总是成立的,如果服务端只是简单地检查SQL语句查询结果是否大于0,那么有可能被攻击。
再例如,如果用户提交
user_name = 'admin'
和
pass_word = '1" or quanxian="345'
,那么上面的语句会被拼接为
'select count(xingming) from students where xuehao="admin" and xingming="1" or quanxian="345"'
这样一来,攻击者就可以通过暴力测试来获取数据库和数据表的结构。如果在代码中不是直接拼接SQL语句,而是使用参数化查询,可以轻易防范这种攻击。另外,对数据进行编码(例如,BASE64编码或MD5摘要)或净化(例如,删除特定的符号)后再使用,也是非常有效的防范技术。
下面几个图分别演示了拼接SQL语句和参数化查询在处理数据时的区别。