专栏名称: Python小屋
清华出版社《Python程序设计》系列教材作者董付国的Python小屋。介绍Python基础语法知识、标准库、扩展库知识,探讨Python在各领域的应用。
目录
相关文章推荐
Python爱好者社区  ·  史上最强!PINN杀疯了 ·  昨天  
Python爱好者社区  ·  英伟达憾失DeepSeek关键人才?美国放走 ... ·  昨天  
Python爱好者社区  ·  离谱!下载DeepSeek最高判刑20年? ·  2 天前  
Python爱好者社区  ·  1885页的Python完全版电子书 ·  3 天前  
Python开发者  ·  o3-mini 碾压 DeepSeek ... ·  5 天前  
51好读  ›  专栏  ›  Python小屋

Python访问SQLite数据库使用参数化查询防SQL注入

Python小屋  · 公众号  · Python  · 2021-02-03 09:41

正文

推荐教材: 《Python程序设计基础与应用》(ISBN:9787111606178),董付国,机械工业出版社
图书详情:
配套资源:
用书教师可以联系董老师获取教学大纲、课件、源码、电子教案、考试系统等配套教学资源。
《Python程序设计基础与应用》前3章书稿PDF免费阅读
《Python程序设计基础与应用》课后习题答案
《Python程序设计基础与应用》配套教学大纲
================
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"'
执行该语句时会抛出异常并提示
no such column: quanxian
这样一来,攻击者就可以通过暴力测试来获取数据库和数据表的结构。如果在代码中不是直接拼接SQL语句,而是使用参数化查询,可以轻易防范这种攻击。另外,对数据进行编码(例如,BASE64编码或MD5摘要)或净化(例如,删除特定的符号)后再使用,也是非常有效的防范技术。
下面几个图分别演示了拼接SQL语句和参数化查询在处理数据时的区别。











请到「今天看啥」查看全文