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支持不够强吧,或者说既想安全又不想麻烦,难搞哦。
其实挺无语的,拼接的都是自身的配置文件内容,并不是用户传递信息。
但是没办法,检测系统就是不给过。只好写解释说明了。
