前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python访问SQLite数据库使用参数化查询防SQL注入

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

作者头像
Python小屋屋主
发布2021-02-24 16:31:55
3.1K0
发布2021-02-24 16:31:55
举报
文章被收录于专栏: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小屋编程大赛详情。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-02-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python小屋 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档