2011-02-04 82 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