#转载请联系

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

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

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语句导入!

最新文章

  1. jQuery 正则选择器
  2. ASP.NET HTTP模拟提交通用类 GET POST
  3. SqlServer常用语句参考
  4. 使用jQuery简单实现产品展示的图片左右滚动功能
  5. C++中“强制转换”的四大天王
  6. UML类图关系大全-转
  7. Eclipse插件checkstyle 代码风格的检查
  8. 让Emeditor支持markdown编辑博客
  9. 关于Two-Pass标记连通域个数
  10. 点击jsp页面上的超链接后怎么找到对应的servlet
  11. shell的字符串和数字的转化(数字自动做字符串处理,变量名做字符串输出用单引号)
  12. 【已解决】【Mac】 运行adb提示command not found,需要配置adb环境
  13. TestNG安装及使用
  14. Unable to resolve module crypto
  15. grid布局笔记学习一之父元素(容器)
  16. Application生命周期
  17. MySQL之多表查询一 介绍 二 多表连接查询 三 符合条件连接查询 四 子查询 五 综合练习
  18. 自定义广播(BroadcastReceiver)事件 --Android开发
  19. json 压缩中文不转码
  20. 2018年10月14日ICPC南京站参赛总结

热门文章

  1. lintcode-109-数字三角形
  2. lintcode-94-二叉树中的最大路径和
  3. PAT 1045 快速排序
  4. Android调用Java WebSevice篇之一
  5. 【bzoj2764】[JLOI2011]基因补全 dp+高精度
  6. BZOJ4597 SHOI2016随机序列(线段树)
  7. [洛谷P1879][USACO06NOV]玉米田Corn Fields
  8. WIN7服务优化,别关太多,小心启动不
  9. Windows关机过程分析与快速关机
  10. 【luogu 1439 最长公共子序列】