pymysql如何解决sql注入问题深入讲解

 更新时间:2019年01月29日 09:07:28   作者:暮良文王  
这篇文章主要给大家介绍了关于pymysql如何解决sql注入问题的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考价值,需要的朋友们下面随着小编来一起学习学习吧

1. SQL 注入

SQL 注入是非常常见的一种网络攻击方式,主要是通过参数来让 mysql 执行 sql 语句时进行预期之外的操作。

即:因为传入的参数改变SQL的语义,变成了其他命令,从而操作了数据库。

产生原因:SQL语句使用了动态拼接的方式。

例如,下面这段代码通过获取用户信息来校验用户权限:

import pymysql

sql = 'SELECT count(*) as count FROM user WHERE id = ' + str(input['id']) + ' AND password = "' + input['password'] + '"'
cursor = dbclient.cursor(pymysql.cursors.DictCursor)
cursor.execute(sql)
count = cursor.fetchone()
if count is not None and count['count'] > 0:
 print('登陆成功')

但是,如果传入参数是:

input['id'] = '2 or 1=1'

你会发现,用户能够直接登录到系统中,因为原本 sql 语句的判断条件被 or 短路成为了永远正确的语句。
这里仅仅是举一个例子,事实上,sql 注入的方式还有很多种,这里不深入介绍了。

总之,只要是通过用户输入数据来拼接 sql 语句,就必须在第一时间考虑如何避免 SQL 注入问题。

那么,如何防止 SQL 注入呢?

2. 预防 SQL 注入 – pymysql 参数化语句

pymysql 的 execute 支持参数化 sql,通过占位符 %s 配合参数就可以实现 sql 注入问题的避免。

import pymysql

sql = 'SELECT count(*) as count FROM user WHERE id = %s AND password = %s'
valus = [input['id'], input['password']]
cursor = dbclient.cursor(pymysql.cursors.DictCursor)
cursor.execute(sql, values)
count = cursor.fetchone()
if count is not None and count['count'] > 0:
 print('登陆成功')

这样参数化的方式,让 mysql 通过预处理的方式避免了 sql 注入的存在。

需要注意的是,不要因为参数是其他类型而换掉 %s,pymysql 的占位符并不是 python 的通用占位符。

同时,也不要因为参数是 string 就在 %s 两边加引号,mysql 会自动去处理。

3. 预防 SQL 注入 – mysql 存储过程

数据库存储过程是 mysql 的一种高级用法,但是一般来说,并不建议使用数据库的存储过程。

主要原因是:

  • 存储过程的语法与普通 SQL 语句语法相差太大,增加维护成本
  • 存储过程在各数据库间不通用且差别较大,给数据库的移植和扩展带来困难
  • 编写困难,数据库脚本语言使用起来还是很不方便的,包括很多数据结构的缺失,让很多事情做起来很困难
  • 调试困难,虽然有一些功能强大的 IDE 提供了数据库存储过程的调试功能,但是通常你需要同时在数据库层面上和业务中同时进行调试,两处调试极为不便
  • 业务耦合,编写存储过程通常是需要在其中放入部分业务逻辑,这使得业务分散在数据层,业务层与数据层的耦合对于项目维护和扩展都会带来极大地不便。

但是,虽然不建议使用存储过程,但是毕竟可以依赖他实现各种跨语言的 sql 注入预防,在复杂的场景下还是有其使用价值的。(以后需要用再去详细学,这里只作简单介绍)

3.1. 存储过程编写

delimiter \DROP PROCEDURE IF EXISTS proc_sql \CREATE PROCEDURE proc_sql (
 in nid1 INT,
 in nid2 INT,
 in callsql VARCHAR(255)
)
BEGIN
 set @nid1 = nid1;
 set @nid2 = nid2;
 set @callsql = callsql;
 PREPARE myprod FROM @callsql;
 -- PREPARE prod FROM 'select * from tb2 where nid>? and nid<?'; 传入的值为字符串,?为占位符
 -- 用@p1,和@p2填充占位符
 EXECUTE myprod USING @nid1,@nid2;
 DEALLOCATE prepare myprod;

END\delimiter ;

3.2. pymsql 中调用

import pymysql

cursor = conn.cursor()
mysql="SELECT * FROM user where nid > ? and nid < ?"
cursor.callproc('proc_sql', args=(11, 15, mysql))
rows = cursor.fetchall()
conn.commit()

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

相关文章

  • navicat怎么卸载,navicat彻底卸载干净教程

    navicat怎么卸载,navicat彻底卸载干净教程

    这篇文章主要介绍了navicat怎么卸载?navicat彻底卸载干净教程。具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • Hive数据导出详解

    Hive数据导出详解

    hive是一个依赖Hadoop集群的数据处理平台,我们不仅需要对数据进行筛选处理,更需要进行导出,供我们多次重复使用,本文主要介绍了hive如何导出数据,感兴趣的小伙伴欢迎阅读
    2023-04-04
  • 记一次SQL优化的实战记录

    记一次SQL优化的实战记录

    作为开发人员,我们免不了与sql打交道,有些sql可能在业务的最开始,执行是毫无问题的,但是随着业务量的提升以及业务复杂度的加 深,可能之前的sql就会需要优化了,下面这篇文章主要给大家介绍了关于一次SQL优化的实战记录,需要的朋友可以参考下
    2022-07-07
  • TDSQL 安装部署附图的实现(图文)

    TDSQL 安装部署附图的实现(图文)

    这篇文章主要介绍了TDSQL 安装部署附图的实现(图文),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10
  • DeepinV20快速安装Mariadb的详细步骤

    DeepinV20快速安装Mariadb的详细步骤

    本文给大家介绍DeepinV20安装Mariadb的详细步骤,MariaDB数据库管理系统是MySQL的一个分支,添加一些功能支持本地的非阻塞操作和进度报告,具体内容详情跟随小编一起看看吧
    2021-07-07
  • 大数据之Spark基础环境

    大数据之Spark基础环境

    本篇文章开始介绍Spark基础知识,包括Spark诞生的背景,应用环境以及入门案例等,感兴趣的同学可以参考阅读本文
    2023-04-04
  • Mac系统Navicat的安装与使用教程

    Mac系统Navicat的安装与使用教程

    这篇文章主要介绍了Mac系统Navicat的破解安装与使用教程,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • 新推出的金融版eXtremeDB 6.0功能改进预览

    新推出的金融版eXtremeDB 6.0功能改进预览

    这篇文章主要介绍了新推出的金融版eXtremeDB 6.0功能改进预览,如运用SQL, Python实现的基于矢量的统计功能、分布式的查询处理、市场数据压缩等内容,需要的朋友可以参考下
    2014-10-10
  • 数据分析数据库ClickHouse在大数据领域应用实践

    数据分析数据库ClickHouse在大数据领域应用实践

    这篇文章主要为大家介绍了数据分析数据库ClickHouse在大数据领域应用实践,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步早日升职加薪
    2022-04-04
  • 使用sqlalchemy-gbasedbt连接GBase 8s数据库的步骤详解

    使用sqlalchemy-gbasedbt连接GBase 8s数据库的步骤详解

    这篇文章主要介绍了使用sqlalchemy-gbasedbt连接GBase 8s数据库的步骤详解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-04-04

最新评论