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

推荐教材: 《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"'

执行该语句时会抛出异常并提示

no such column: quanxian

这样一来,攻击者就可以通过暴力测试来获取数据库和数据表的结构。如果在代码中不是直接拼接SQL语句,而是使用参数化查询,可以轻易防范这种攻击。另外,对数据进行编码(例如,BASE64编码或MD5摘要)或净化(例如,删除特定的符号)后再使用,也是非常有效的防范技术。

下面几个图分别演示了拼接SQL语句和参数化查询在处理数据时的区别。

,在公众号后台发送消息“ 大事记 ”可以查看董付国老师与Python有关的重要事件;发送消息“ 教材 ”可以查看董付国老师出版的Python系列教材(已累计印刷超过115次)的适用专业详情;发送消息“ 历史文章 ”可以查看董付国老师推送的超过1000篇原创技术文章;发送消息“ 会议 ”或“ 培训 ”可以查看近期董付国老师的培训安排;发送消息“ 微课 ”可以查看董付国老师免费分享的超过500节Python微课视频;发送消息“ 课件 ”可以查看董付国老师免费分享的Python教学资源;发送消息“ 小屋刷题 ”可以下载“Python小屋刷题神器”,免费练习1318道客观题和185道编程题,题库持续更新;发送消息“ 编程比赛 ”了解Python小屋编程大赛详情。 返回搜狐,查看更多

责任编辑:

声明:该文观点仅代表作者本人,搜狐号系信息发布平台,搜狐仅提供信息存储空间服务。