2011-02-04 50 views
1

我有一个Access数据库,必须以编程方式连接到Oracle以创建链接表。连接字符串的形式如下:MS Access - 防止连接字符串中的SQL注入

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

当前登录信息是硬编码的。

我现在必须将该工具连接到不同的数据库。我打算让用户输入<User>,<Password><Server>,然后将它们连接在一起形成单个连接字符串。我很肯定这是SQL注入安全的,因为连接实际上并不存在,但我不是100%确定 - 这是一个有效的资源,如果是的话,我将如何清理这些输入(来自自由形式的文本字段)?

回答

1

看起来您的担心是有效的,ADO.NET有一组Connection String Builder类(尽管由于没有SQL而将其称为“连接字符串注入”与“SQL注入”更为准确参与)。既然你没有使用.NET,下一个最好的选择是输入消毒和转义特殊字符。该MSDN reference对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'\" 

但是,这不适用于所有可能的输入。例如,当密码在分号前包含双引号时,测试脚本会给出错误。这可能是我错误地解释了指南。我不确定,但希望这至少可以让你开始。

2

这不称为SQL注入,因为连接字符串不允许执行任意SQL代码。

如果您允许用户从桌面访问数据库,那么无论如何SQL注入可能不是一个非常相关的问题。为什么任何人都会试图通过应用程序漏洞注入SQL,因为只需使用有效凭证自行创建连接就简单多了?

+1

此外,可能发生的最坏情况是什么?他们有一个用户ID,一个密码和一个服务器名称。有了它,他们可以连接到应用程序之外的数据库,并将数据转移到他们心中的内容。这只是他们被允许随着您在数据库中给予他们的帐户的赠款而改变的内容。如果他们想精心制作一个字符串来删除所有的表格,而且他们可以做到这一点,那是因为您首先向他们提供了这些权利。他们可以用任何ODBC SQL客户端来完成。 – BIBD 2011-02-05 15:41:40