Python 2.7 (sqlite3) для SQL Oracle, безопасные переменные (предотвращение внедрения SQL) - PullRequest
0 голосов
/ 05 июня 2018
if instance = "PROD":
     dblink = ('db9_pub',)
elif instance = "BETA":
     dblink = ('dbq9_pub',)
elif instance = "TEST"
     dblink = ('dbt9_pub',)

#Pre-defined SQL Statements    

table1_select = ("""select * from example.table1@? """)
table1_insert = ("""insert into example.table1@? (SQL_SELECT_STATEMNT) """)

conn1 = cx_Oracle.connect(logininfo)
cursor1 = conn1.cursor()

cursor1.execute(table1_select,(dblink))
cursor1.execute(table1_insert,(dblink))

Итак, я собираюсь начать писать множество скриптов на python, которые должны будут передавать переменные в операторы SQL.Некоторые будут безопаснее, чем опубликованный сценарий, некоторые должны быть защищены от атак с использованием SQL-инъекций.Я хотел бы понять разницу между использованием различных переменных методов и тех, которые являются наиболее подходящими.

**% s, '% s',?,: 1 Мне все кажется одинаковым.Каков подходящий способ сделать это для безопасного кода?** Я думаю, что я решил это, мне нужно? Из-за API, который я использую.

Кстати, опубликованный скрипт выдает ошибку: недопустимое имя / номер переменной, поэтому яочевидно, не понимая даже основного применения этого.

============= Редактировать: я нашел эту информацию на странице (http://bobby -tables.com /Python ), который на самом деле помогает некоторым.Он помогает мне определить, какую версию заполнителя использовать, но не сообщает мне, как защититься от внедрения SQL.

1 Ответ

0 голосов
/ 06 июня 2018

В приведенном выше коде вы не можете использовать переменную в строке запроса для указанного DBLink.Переменные связывания разрешены только в местах, где разрешено выражение, и они никогда не будут интерпретироваться как объект базы данных (имя таблицы, имя столбца, имя функции и т. Д.).Тем не менее, поскольку вы, по-видимому, полностью контролируете DBLink через цепочечные операторы if, было бы безопасно (в данном случае) объединить DBLink в строки запроса:

if instance = "PROD":
     dblink = ('db9_pub',)
elif instance = "BETA":
     dblink = ('dbq9_pub',)
elif instance = "TEST"
     dblink = ('dbt9_pub',)

#Pre-defined SQL Statements    

table1_select = ("""select * from example.table1@%s """%(dblink))
table1_insert = ("""insert into example.table1@%s (SQL_SELECT_STATEMNT) """%(dblink))

conn1 = cx_Oracle.connect(logininfo)
cursor1 = conn1.cursor()

cursor1.execute(table1_select)
cursor1.execute(table1_insert)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...