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

推荐教材:《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语句和参数化查询在处理数据时的区别。

温馨提示:

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

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值