У меня есть база данных Access, которая должна программно подключаться к Oracle для создания связанной таблицы. Строка подключения имеет вид:
ODBC;Driver={Microsoft ODBC for Oracle};Pwd=<Password>;UID=<User>;Server=<Server>
В настоящее время данные для входа жестко запрограммированы.
Теперь мне нужно подключить инструмент к разным базам данных. Я собирался просто позволить пользователю ввести <User>
, <Password>
и <Server>
, а затем просто объединить все это в одну строку подключения. Я почти уверен, что это безопасная SQL-инъекция, потому что на данный момент соединение фактически не существует, но я не уверен на 100% - это действительный договор, и если да, то как бы я дезинфицировал эти входные данные (которые поступают из текстовые поля произвольной формы)?
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'\"
Однако это работает не для всех возможных входов. Например, тестовый сценарий выдает ошибку, если пароль содержит двойные кавычки перед точкой с запятой. Возможно, я неправильно интерпретирую правила. Я не уверен, но надеюсь, это, по крайней мере, поможет вам начать.
Это не называется внедрением SQL, поскольку строка подключения не позволяет выполнить произвольный код SQL.
Если вы предоставляете пользователям доступ к базе данных с рабочего стола, то SQL Injection, вероятно, в любом случае не имеет большого значения. Зачем кому-то пытаться внедрить SQL через уязвимость приложения, если ему намного проще просто создать соединение самостоятельно, используя свои действительные учетные данные?
Похожие вопросы
Связанные вопросы
Новые вопросы
ms-access
Microsoft Access, также известный как Microsoft Office Access, является средством разработки приложений и баз данных от Microsoft. Он сочетает в себе Microsoft Jet / ACE Database Engine с графическим интерфейсом пользователя и инструментами разработки программного обеспечения. Другие механизмы базы данных, такие как SQL Server, также могут использоваться в качестве сервера базы данных для приложений Access.