当前位置:首页 > 数据库 > 正文内容

python操作数据库动态传递数据库名/数据库表出现的问题

root4年前 (2020-10-30)数据库675

环境:py3/py2 
依赖包:pymsql/MySQLdb

开发某项时,j对项目进行安全检查,给出sql注入风险。
修改代码是发现是sql语句进行了拼接。

拼接的内容是数据库名/数据表名。

然后我尝试了对数据库名和数据表名进行传参方式进行了测试。

import pymysql

class MySqlDBClass:
    def __init__(self, DBHOST, DBUSER, DBPASS):
        self.DBHOST = DBHOST
        self.DBUSER = DBUSER
        self.DBPASS = DBPASS

    def createDB(self,dbname):
        conn = pymysql.connect(host=self.DBHOST, user=self.DBUSER, passwd=self.DBPASS, charset="utf8")
        create_db = "CREATE DATABASE IF NOT EXISTS `%s`;"
        cursor =conn.cursor()
        # 拼接执行
        # cursor.execute(create_db % (dbname,))
        # 传参执行
        cursor.execute(create_db, (dbname,))

    def create_table(self,table_name):
        conn = pymysql.connect(host=self.DBHOST, user=self.DBUSER, passwd=self.DBPASS, db='test', charset="utf8")
        create_table = '''CREATE TABLE  IF NOT EXISTS `%s`  (`id` int(11) UNSIGNED NOT NULL  AUTO_INCREMENT,`ipid` int(11) UNSIGNED NOT NULL,`taskid` varchar(100) NOT NULL,PRIMARY KEY (`id`)) '''
        cursor = conn.cursor()
        # 拼接执行
        # cursor.execute(create_table % (table_name,))
        # 传参执行
        cursor.execute(create_table, (table_name,))

if __name__ == "__main__":
    """"""
    MySqlDB = MySqlDBClass("192.168.1.197", "root", "mysql")
    MySqlDB.createDB("test")
    # MySqlDB.create_table("test_table")

拼接执行创建数据库

    执行的结果正常
传参执行创建数据库

    执行结果是数据库名多出两个单引号

如下图

    97CF67AD-13B4-4ae1-BFDD-8CC87E6DADA4.png

同样的

拼接执行创建数据表

    执行的结果正常
传参执行创建数据表

    执行结果是数据表名多出两个单引号

F561C382-A54D-4129-B63A-C8ED560D8640.png

这就是python对传递参数形式指定数据库表名/库名的差异。

只能是py支持不够强吧,或者说既想安全又不想麻烦,难搞哦。

其实挺无语的,拼接的都是自身的配置文件内容,并不是用户传递信息。

但是没办法,检测系统就是不给过。只好写解释说明了。

扫描二维码推送至手机访问。

版权声明:本文由一叶知秋发布,如需转载请注明出处。

本文链接:https://zhiqiu.top/?id=27

分享给朋友:

相关文章

es 迁移数据elasticdump工具的使用

安装直接使用是可以,采用docker进行迁移也是可以的,我这边采用的是docker导出数据为json文件docker run --rm -ti -v /tmp:/tmp regis...

被Navicat坑哭的日常,版本问题

mysql5.7DROP TABLE IF EXISTS `xxx_copy1`;CREATE TABLE `xxx_copy1`  (  `id` int(11) UNSIGNED NOT NULL AUTO_INCR...

mysql事务的四个隔离机制理解

禁止自动提交 SET AUTOCOMMIT=0  开启自动提交 SET AUTOCOMMIT=1  读未提交 //设置read uncommitted级别: set ...

mysql 导出csv格式数据

mysql -e "select * from newsdb.t_hk_stock_news where id <100  ...

dataX:超强的数据库数据互导工具

安装下载安装包http://datax-opensource.oss-cn-hangzhou.aliyuncs.com/datax.tar.gz 然后解压进入解压后文件的./bin自检命令python  datax.py ../j...

clickhouse基本数据类型

整型有符号整型Int8 - [-128 : 127]Int16 - [-32768 : 32767]Int32 - [-2147483648 : 2147483647]Int64 - [-9223372036854775808 : 9223...