我有一个Access数据库,必须以编程方式连接到Oracle才能创建链接表。连接字符串的格式为:
ODBC;Driver={Microsoft ODBC for Oracle};Pwd=<Password>;UID=<User>;Server=<Server>
目前登录信息是硬编码的。
我现在必须让该工具连接到不同的数据库。我只是让用户输入<User>
,<Password>
和<Server>
,然后将它们连接成一个连接字符串。我很确定这是SQL注入安全的,因为此时连接实际上并不存在,但我不是100%肯定 - 这是一个有效的关注点,如果是这样,我将如何清理这些输入(来自自由格式文本字段)?
答案 0 :(得分:2)
这不称为SQL注入,因为连接字符串不允许执行任意SQL代码。
如果您允许用户从桌面访问数据库,那么SQL注入可能不是一个非常相关的问题。为什么有人会因为使用他的有效凭证自己创建连接而更容易通过应用程序漏洞尝试注入SQL?
答案 1 :(得分:1)
似乎您的关注是有效的,ADO.NET有一组Connection String Builder类这一事实就证明了这一点(尽管将其称为“连接字符串注入”与“SQL注入”相比更准确没有SQL参与)。由于您不使用.NET,下一个最佳选择是输入清理和转义特殊字符。 OLEDB连接字符串语法上的MSDN reference表明:
包含包含的值 分号,单引号字符或 双引号字符,值必须 用双引号括起来。
和
如果值包含两者 单引号和双引号 字符,使用的引用字符 封装值必须加倍 每次都在值内发生。
这是我整理的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'\"
但是,这并不适用于所有可能的输入。例如,当密码在分号前包含双引号时,测试脚本会出错。可能是因为我错误地解释了指南。我不确定,但希望这至少可以让你开始。