将列用作变量

时间:2016-07-21 08:40:14

标签: python sql-server sql-injection pymssql

我正在使用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)

现在我不能使用白名单,因为我不知道要添加什么列名,我能想到的唯一其他选项是使用黑名单,但我想知道是否可能存在第三个选项。

(列名来自具有类型字符串的表中的列)

1 个答案:

答案 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()处理了这件事。