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

root6个月前数据库31

环境: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支持不够强吧,或者说既想安全又不想麻烦,难搞哦。

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

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

相关文章

mysql启动失败 日志InnoDB: Ignoring the redo log due to missing MLOG_CHECKPOINT between the checkpoint 3485

mysql报错Ignoring the redo log due to missing MLOG_CHECKPOINT betweenmysql版本:5.7.33系统版本:ubuntu16.04由于电...

如何解决 MySQL max_allowed_packet 错误

如何解决 MySQL max_allowed_packet 错误

修改global变量并退出session,重新登录,可行。修改数据库配置,未测试。方法/步骤先看看与这个错误相关的后台异常 :  Packet for quer...