我正在使用pymssql来更新,删除和添加列到MS SQL服务器。列是由外部源设置的可悲变量,例如读取数据库,从另一个数据库读取。现在我正试图阻止“坏”sql通过,因为我不知道其他数据库给我的确切内容。
'ALTER TABLE tablenameA ADD [' + columnname + '] varchar(25) NULL'
'ALTER TABLE tablenameA DROP COLUMN ['+columnname+']'
('UPDATE tablenameA SET [' + columnname + ']=%s WHERE id = 2', value)
现在我不能使用白名单,因为我不知道要添加什么列名,我能想到的唯一其他选项是使用黑名单,但我想知道是否可能存在第三个选项。
(列名来自具有类型字符串的表中的列)
答案 0 :(得分:3)
Transact-SQL具有将SQL字符串转换为安全对象名称的功能:QUOTENAME()
。在绑定参数周围使用它以使数据库驱动程序提供正确引用的SQL对象:
cursor.execute('SELECT QUOTENAME(%s)', (columnname,))
quoted_columnname, = next(cursor)
现在,您可以在新查询中使用 字符串:
query = 'ALTER TABLE tablenameA ADD {} varchar(25) NULL'.format(quoted_columnname)
等。我使用str.format()
在这里插入字符串,而不是使用字符串连接。请注意,不再需要[...]
方括号; QUOTENAME()
处理了这件事。