2011-06-01 98 views
5

我目前使用MySql,但寧願使用ODBC解決方案使其成爲未來的證明。如何清理ODBC數據庫輸入?

如何在將用戶輸入傳遞到ODBC數據庫之前對用戶輸入進行清理?

而且,當我在它的時候,我用雙引號包裹我的字符串,例如, 「INSERT INTO VALUES(介紹)‘’` - 但如果文字本身包含雙引號

+1

你是指什麼樣的用戶輸入?例如,如果用戶給你提供查詢來運行,那麼你就有很多工作要做。正如你所提到的,除了轉義特殊字符之外,還需要注意諸如SQL注入之類的安全問題,並且您可能還想限制可接受的語句集(例如,不要允許DDL)。另一方面,如果用戶只是給你提供數據,而你的應用程序使用ODBC將數據寫入數據庫,那麼你不必做任何事情,因爲數據和SQL語句不會混合。 – 2011-06-01 07:57:42

+1

可能重複的[Delphi - 預防SQL注入](http://stackoverflow.com/questions/6000648/delphi-prevent-against-sql-injection) – Johan 2011-06-01 08:58:27

+0

ODBC將**不會**使它成爲未來的證明,它會讓它慢下來,剝奪你的選擇,並使其越野車。任何數量的替代品都可以,ZEOS可以連接大約10個數據庫,ADO也可以。 – Johan 2011-06-01 22:03:59

回答

8

嘗試使用參數化的SQL語句

這樣。

INSERT INTO MyTable (Field1,Field2) VALUES (:Param1,:Param2) 

檢查本文從英巴卡迪諾有關如何使用參數Using Parameters in Queries.

+0

+1我試圖按照http://docwiki.embarcadero.com/CodeExamples/en/ADOQuery_%28Delphi%29的例子,但我得到一個'_latin1'的例外我會發表另一個問題,要求幫助。 – Mawg 2011-06-05 04:42:37

3

使用hibernate如果可以的話,可能通過RMI從德爾福雖然它的Java爲中心的,它幾乎完全隔絕的程序員?底層的數據庫,並處理您提到的問題和更多的問題。

btw,回答你的問題重新雙引號,保存包含雙引號的值,將它們轉義爲雙引號,例如

This is "my" text 

將被保存爲

"This is ""my"" text" 
+0

-1,首先是ODBC,而不是hibernate,需要多少級別的間接尋址,只需使用params和本地代碼即可。 – Johan 2011-06-01 22:01:07

8
  1. ODBC不是使用MySQL的最佳方式。即使您將來需要支持少數DBMS,那麼您也可以考慮使用dbExpress(附帶Delphi)和3d方--DifRex(AnyDAC)(商業版),ZeosLib(免費軟件)等多DBMS數據訪問庫。
  2. If您需要將字符串常量替換爲MySQL查詢,然後您需要esacape the special characters或將字符串轉換爲hexadecimal representation。這可以保護您免受可能的SQL注入和語法錯誤。但是使您的查詢準備更加複雜。
  3. 最好的方法 - 使用參數並提交文字作爲參數值。這很簡單,安全。