#转载请联系

假如你在京东工作,你要做的任务就是做一个商品搜索的东西供用户使用。

然后你写出了这么一个程序的雏形。

import pymysql

def main():
conn = pymysql.connect(host='localhost',port=3306,user='root',password='xxx',
database='db_jingdong',charset='utf8')
cur = conn.cursor()
item = input("请输入你要查询的商品编号:")
cur.execute('select * from goods where id=%s' % item)
result = cur.fetchall()
for i in result:
print(i) if __name__ == '__main__':
main() 输出:
请输入你要查询的商品编号:
(1, 'r510vc 15.6英寸笔记本', 1, '华硕', Decimal('3399.000'), b'\x01', b'\x00')

看似没有什么问题。但是当恶意的人士输了这么一段字符串,就暴露了京东的全部商品了。

请输入你要查询的商品编号:'' or 1
(1, 'r510vc 15.6英寸笔记本', 1, '华硕', Decimal('3399.000'), b'\x01', b'\x00')
(2, 'y400n 14.0英寸笔记本电脑', 1, '联想', Decimal('4999.000'), b'\x01', b'\x00')
(3, 'g150th 15.6英寸游戏本', 2, '雷神', Decimal('8499.000'), b'\x01', b'\x00')
(4, 'x550cc 15.6英寸笔记本', 1, '华硕', Decimal('2799.000'), b'\x01', b'\x00')
(5, 'x240 超极本', 3, '联想', Decimal('4880.000'), b'\x01', b'\x00')
(6, 'u330p 13.3英寸超极本', 3, '联想', Decimal('4299.000'), b'\x01', b'\x00')
(7, 'svp13226scb 触控超极本', 3, '索尼', Decimal('7999.000'), b'\x01', b'\x00')
(8, 'ipad mini 7.9英寸平板电脑', 4, '苹果', Decimal('1998.000'), b'\x01', b'\x00')
(9, 'ipad air 9.7英寸平板电脑', 4, '苹果', Decimal('3388.000'), b'\x01', b'\x00')
(10, 'ipad mini 配备 retina 显示屏', 4, '苹果', Decimal('2788.000'), b'\x01', b'\x00')
(11, 'ideacentre c340 20英寸一体电脑 ', 5, '联想', Decimal('3499.000'), b'\x01', b'\x00')
(12, 'vostro 3800-r1206 台式电脑', 5, '戴尔', Decimal('2899.000'), b'\x01', b'\x00')
(13, 'imac me086ch/a 21.5英寸一体电脑', 5, '苹果', Decimal('9188.000'), b'\x01', b'\x00')
(14, 'at7-7414lp 台式电脑 linux )', 5, '宏碁', Decimal('3699.000'), b'\x01', b'\x00')
(15, 'z220sff f4f06pa工作站', 6, '惠普', Decimal('4288.000'), b'\x01', b'\x00')
(16, 'poweredge ii服务器', 6, '戴尔', Decimal('5388.000'), b'\x01', b'\x00')
(17, 'mac pro专业级台式电脑', 6, '苹果', Decimal('28888.000'), b'\x01', b'\x00')
(18, 'hmz-t3w 头戴显示设备', 7, '索尼', Decimal('6999.000'), b'\x01', b'\x00')
(19, '商务双肩背包', 7, '索尼', Decimal('99.000'), b'\x01', b'\x00')
(20, 'x3250 m4机架式服务器', 6, 'ibm', Decimal('6888.000'), b'\x01', b'\x00')
(21, '商务双肩背包', 7, '索尼', Decimal('99.000'), b'\x01', b'\x00')

'' or 1是什么东西,这么神奇呢?其实道理很简单。你把它拼成完整的SQL语句就发现了。

select * from goods where id=‘’ or 1

or 满足一个条件即可。1为真,所以就查找出了全部商品信息了。

  • 解决办法

解决办法也很简单,只需要把sql参数化即可。怎么操作呢?看下面的示例

import pymysql

def main():
conn = pymysql.connect(host='localhost',port=3306,user='root',password='xxx',
database='db_jingdong',charset='utf8')
cur = conn.cursor()
item = input("请输入你要查询的商品编号:")
sql = 'select * from goods where id=%s' # %s在这里充当占位符
args = [item] # args: tuple, list or dict
cur.execute(sql,args)
result = cur.fetchall()
for i in result:
print(i) if __name__ == '__main__':
main() 输出:
请输入你要查询的商品编号:1
(1, 'r510vc 15.6英寸笔记本', 1, '华硕', Decimal('3399.000'), b'\x01', b'\x00') 输出:
请输入你要查询的商品编号:'' or 1 Process finished with exit code 0

只需要把参数单独传给execute()函数,他内部会自动帮你筛选掉不合法的字符。从而保证数据库的安全!

所以,以后用python编写与mysql数据库交互的代码,记得记得!参数交给execute()处理,不要自己在sql语句导入!

sql参数化防止sql注入导致的暴露数据库问题的更多相关文章

  1. sql参数化查询避免注入漏洞的原因探析

    网上其他同学的都说是重用执行计划,将用户输入的作为文本查询,到底如何实现,我用下面三行代码来解析一下. DECLARE @test NVARCHAR() SET @test=' or 1='1 SEL ...

  2. 一次SQL注入导致的"越权"

    原文来自SecIN社区-作者:tkswifty 相关背景   在实际的业务开发中,SQL交互往往是业务系统中不可或缺的一项.在Java中提供了类似Mybatis.Hibernate.SpringDat ...

  3. SQL参数化查询--最有效可预防SQL注入攻击的防御方式

    参数化查询(Parameterized Query 或 Parameterized Statement)是访问数据库时,在需要填入数值或数据的地方,使用参数 (Parameter) 来给值. 在使用参 ...

  4. 然之协同系统6.4.1 SQL注入导致getshell

     前言 先知上一个大佬挖的洞,也有了简单的分析 https://xianzhi.aliyun.com/forum/topic/2135 我自己复现分析过程,漏洞的原理比较简单,但是漏洞的利用方式对我而 ...

  5. 参数化防SQL注入

    private void AddStudent(){ string strName =txtName.Text.Trim(); string strPwd = txtPwd.Text.Trim(); ...

  6. SQL参数化

    本文来自:caodonglin 一.SQL参数化为什么能防注入? 因为执行计划被重用了,所以可以防SQL注入. 下面有两段SQL     正常SQL: 1 select COUNT(1) from C ...

  7. 网络攻击技术:SQL Injection(sql注入)

    网络攻击技术开篇——SQL Injection   1.1.1 摘要 日前,国内最大的程序员社区CSDN网站的用户数据库被黑客公开发布,600万用户的登录名及密码被公开泄露,随后又有多家网站的用户密码 ...

  8. [转帖] SQL参数化的优点 CopyFrom https://www.cnblogs.com/-lzb/articles/4840671.html

    梦在远方的小猪 感谢原作者...  后面总结的五点感觉挺好的.. 自己之前的知识点一直没有串起来. 转帖记录一下感谢. sql参数化参数化 说来惭愧,工作差不多4年了,直到前些日子被DBA找上门让我优 ...

  9. SQL参数化查询

    参数化查询(Parameterized Query 或 Parameterized Statement)是指在设计与数据库链接并访问数据时,在需要填入数值或数据的地方,使用参数 (Parameter) ...

随机推荐

  1. hibernate延时加载机制

    延迟加载: 延迟加载机制是为了避免一些无谓的性能开销而提出来的,所谓延迟加载就是当在真正需要数据的时候,才真正执行数据加载操作.在Hibernate中提供了对实体对象的延迟加载以及对集合的延迟加载,另 ...

  2. 剑指offer:正则表达式匹配

    目录 题目 解题思路 具体代码 题目 题目链接 剑指offer:正则表达式匹配 题目描述 请实现一个函数用来匹配包括'.'和'*'的正则表达式.模式中的字符.表示任意一个字符,而*表示它前面的字符可以 ...

  3. asp.net中的cookie

    一.cookie导读,理解什么是cookie 1.什么是cookie:cookie是一种能够让网站服务器把少量数据(4kb左右)存储到客户端的硬盘或内存.并且读可以取出来的一种技术. 2.当你浏览某网 ...

  4. [剑指Offer] 12.数值的整数次方

    [思路1]递归 class Solution { public: double Power(double base, int exponent) { ){ /base; exponent = -exp ...

  5. poj 1753 Flip Game (dfs)

    Flip Game Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 28805   Accepted: 12461 Descr ...

  6. hdu 2199 Can you solve this equation? (二分法)

    Can you solve this equation? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K ( ...

  7. IntellIJ IDEA 配置 Git,顺带解决Git Push rejected问题

    1.下载便携版本git https://git-scm.com/download/win 弹出的下载取消,重新选择 2.解压自压缩文件. 3.配置IDEA 4.测试 5.配置终端环境shell为bas ...

  8. 【Linux】线程池

    首先,线程池是什么?顾名思义,就是把一堆开辟好的线程放在一个池子里统一管理,就是一个线程池. 其次,为什么要用线程池,难道来一个请求给它申请一个线程,请求处理完了释放线程不行么?也行,但是如果创建线程 ...

  9. taotao购物车

    功能分析: 1.在用户不登陆的情况下也可以使用购物车,那么就需要把购物车信息放入cookie中. 2.可以把商品信息,存放到pojo中,然后序列化成json存入cookie中. 3.取商品信息可以从c ...

  10. 一个简易的Python全站抓取系统

    很长时间没有更新博客了,前一阵时间在做项目,里面有一个爬虫系统,然后就从里面整理了一点代码做成了一个简易的爬虫系统,还挺实用的. 简单说来,这个爬虫系统的功能就是:给定初始的链接池,然后设定一些参数, ...