python操作数据库动态传递数据库名/数据库表出现的问题
环境: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")
拼接执行创建数据库
执行的结果正常
传参执行创建数据库
执行结果是数据库名多出两个单引号
如下图
同样的
拼接执行创建数据表
执行的结果正常
传参执行创建数据表
执行结果是数据表名多出两个单引号
这就是python对传递参数形式指定数据库表名/库名的差异。
只能是py支持不够强吧,或者说既想安全又不想麻烦,难搞哦。
其实挺无语的,拼接的都是自身的配置文件内容,并不是用户传递信息。
但是没办法,检测系统就是不给过。只好写解释说明了。