2016-07-21 7 views
0

Я использую pymssql для обновления, удаления и добавления столбцов на сервер MS SQL. столбцы являются грустными переменными, заданными внешними источниками, такими как чтение базы данных, чтение из другой базы данных. Теперь я пытаюсь предотвратить «плохой» 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) 

Теперь я не могу использовать белый список, как я не знаю, что имена столбцов должны быть добавлены, мой только другой вариант я могу думать о том, чтобы использовать черный список, но я был, если интересно, может быть, существует третий вариант.

(Имена столбцов получили из столбца таблицы с типом строки)

+2

Вы можете использовать ['QUOTENAME'] (https://msdn.microsoft.com/en-us/library/ms176114.aspx) –

+0

Из той же документации' QUOTENAME': * Возвращает строку ** Unicode ** с добавлением разделителей, чтобы сделать входную строку действительным идентификатором с разделителями SQL Server. * Строка все еще не будет работать здесь, так как она не создает полный оператор SQL. –

+0

Будет ли запрашивать базу данных один раз с помощью 'SELECT QUOTENAME (% s)', а затем интерполировать ее в запрос ...? – deceze

ответ

2

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() позаботился об этом.

 Смежные вопросы

  • Нет связанных вопросов^_^