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

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

root6年前 (2020-10-30)数据库1401

环境: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

分享给朋友:

相关文章

电脑断电导致mysql不可用,删除ib_logfile0和ib_logfile1恢复

mysql安装在虚拟机中,公司突然断电导致mysql启动失败查看mysql的error日志2021-05-19T06:44:51.993300Z 0 [ERROR] InnoDB: Ignoring the redo log due to...

postgresql 的安装使用

安装centos系统 9.6版本# Install the repository RPMsudo yum install -y https://download.postgresql.org/pub/repos/yum/repor...

centos7 安装mysql

centos7 安装mysql

下载rpm包wget -i -c http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm 安裝包仓库yum -y install * 或者yum -...

postgresql修改数据存储位置

postgresql修改数据存储位置

最近公司提供了一台新的服务器,同时有一个盘是ssd。同时为了测试postgresql的性能,将数据放置到ssd上系统centos7.9 数据库postgresql-9.6首先停掉数据库systemctl stop pos...

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

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

清空postgresql的缓存

系统:centos,版本:postgresql-9.6因为要测试postgresql的性能,当多次查询的时候查询结果会因为缓存用时很短,不能模拟出现实使用的场景。因此需要清除缓存。首先stop掉postgresqlsystemctl sto...