MS Access - предотвратить внедрение SQL в строку подключения - PullRequest
1 голос
/ 05 февраля 2011

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

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

В настоящее время информация для входа в систему жестко закодирована.

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

Ответы [ 2 ]

2 голосов
/ 05 февраля 2011

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

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

1 голос
/ 05 февраля 2011

Похоже, что ваша озабоченность действительна, о чем свидетельствует тот факт, что ADO.NET имеет набор Connection String Builder классов (хотя правильнее называть это «внедрение строки соединения» против »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'\"

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

...