У меня есть база данных Access, которая должна программно подключаться к Oracle для создания связанной таблицы. Строка подключения имеет вид:

ODBC;Driver={Microsoft ODBC for Oracle};Pwd=<Password>;UID=<User>;Server=<Server>

В настоящее время данные для входа жестко запрограммированы.

Теперь мне нужно подключить инструмент к разным базам данных. Я собирался просто позволить пользователю ввести <User>, <Password> и <Server>, а затем просто объединить все это в одну строку подключения. Я почти уверен, что это безопасная SQL-инъекция, потому что на данный момент соединение фактически не существует, но я не уверен на 100% - это действительный договор, и если да, то как бы я дезинфицировал эти входные данные (которые поступают из текстовые поля произвольной формы)?

1
FrustratedWithFormsDesigner 5 Фев 2011 в 00:07

2 ответа

Лучший ответ

Похоже, что ваше беспокойство обосновано, о чем свидетельствует тот факт, что ADO.NET имеет набор Конструктор строк подключения (хотя точнее называть это« инъекцией строки подключения », а не« инъекцией SQL », поскольку здесь нет SQL). Поскольку вы не используете .NET, следующий лучший вариант - это очистка ввода и экранирование специальных символов. справочник MSDN о состояниях синтаксиса строки подключения OLEDB что:

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

А также

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

Это VBScript, который я собрал, который пытается реализовать два приведенных выше правила:

Option Explicit

Dim pw, connStr, conn

pw = InputBox("Enter password")

' Sanitize double quotes in the input string
pw = Replace(pw, Chr(34), Chr(34) & Chr(34))

' Notice how pw is surrounded by double quote characters
connStr = "Provider=SQLOLEDB;Data Source=.\SQLEXPRESS;User ID=test_user;Password=" & Chr(34) & pw & Chr(34)

' Test the connection.  We'll get a runtime error if it didn't work
Set conn = CreateObject("ADODB.Connection")
conn.Open connStr
conn.Close
WScript.Echo "OK!"

Если бы мой пароль был app"le'\, строка подключения выглядела бы так:

Provider=SQLOLEDB;Data Source=.\SQLEXPRESS;User ID=test_user;Password="app""le'\"

Однако это работает не для всех возможных входов. Например, тестовый сценарий выдает ошибку, если пароль содержит двойные кавычки перед точкой с запятой. Возможно, я неправильно интерпретирую правила. Я не уверен, но надеюсь, это, по крайней мере, поможет вам начать.

1
Cheran Shunmugavel 5 Фев 2011 в 12:15

Это не называется внедрением SQL, поскольку строка подключения не позволяет выполнить произвольный код SQL.

Если вы предоставляете пользователям доступ к базе данных с рабочего стола, то SQL Injection, вероятно, в любом случае не имеет большого значения. Зачем кому-то пытаться внедрить SQL через уязвимость приложения, если ему намного проще просто создать соединение самостоятельно, используя свои действительные учетные данные?

2
nvogel 5 Фев 2011 в 14:30
1
Кроме того, что самое худшее, что может случиться? У них есть идентификатор пользователя, пароль и имя сервера. Благодаря этому они могут подключаться к вашей базе данных за пределами вашего приложения и перемещать данные по своему усмотрению. Это будет только то, что им разрешено изменить с помощью грантов, которые вы предоставили их учетной записи в базе данных. Если они хотят тщательно обработать строку, чтобы отбросить все таблицы, и они могут это сделать, то это потому, что вы изначально дали им эти права. Они могут сделать это с любым клиентом ODBC SQL.
 – 
BIBD
5 Фев 2011 в 18:41