2010-03-03 28 views
0

我正在做一個asp網站。搜索中的數據庫錯誤

當我開始

名稱的搜索這樣的奧尼爾

我得到一個數據庫錯誤。

我得到這個錯誤是因爲那個名字。

我該如何在asp中刪除這個錯誤。

如果它在asp中我們可以使用addslashes和stripslashes,但我怎麼能做到這一點在asp?

請幫

回答

2

無論是選擇特定的字符串值,或將其插入到數據庫中,字符串必須是有效的SQL,具體如下:

  • 字符串的開始標記由單引號字符
  • 作爲字符串一部分的任何單引號都必須加倍(以免SQL將它理解爲字符串末尾)
  • 字符串的末尾用單引號標記。

因此

'O''Neil' 

是適當的方式 「代碼」 的名字奧尼爾,因爲如果我們使用

'O'Neil' 

相反,SQL會認爲這是一個字符串,開始與字母O,但在那之後結束。這個單個字母的字符串後面跟着SQL無法理解的表達式Neil'


上述信息將會允許你存儲的名稱和它保留嵌入名稱與愛爾蘭O'xxxx單引號的方式來查詢它們。
除了幫助你解決這個問題之外,如果我忘記提到SQL injection的風險,我會失去工作。

現在您明白非雙倍單引號會終止字符串,您可以看到惡意用戶如何使用它來「欺騙」應用程序。
例如假設用戶以某種方式猜測,在使用該表是search,他/她可以繼續前進,填寫下列字符串中的應用程序的編輯框中

O'; DELETE FROM search where 'a%'='a 

你的邏輯將使用此字符串如下

Lstart="O'; DELETE FROM search where 'a%'='a"; select * from search where lname like '%Lstart%' 
-- which effectively will be substituted as 
select * from search where lname like '%O'; DELETE FROM search where 'a%'='a%' 

其中,如果與基礎SQL連接關聯的帳戶是如此認可,會導致刪除表中的所有行,並留下您的應用程序碎了!

通過系統地加倍單引號,以及一些其他預防措施(如使用參數化查詢),可以保護應用程序(及其數據庫)免受此類攻擊。

+0

是的,你可能想詳細說明如何在它們到達數據庫之前將它們轉義出來。 – Russell 2010-03-03 06:03:01

+0

對不起,我沒有正確地得到你。 它是一個網站的用戶將鍵入 例如杜澤 – 2010-03-03 06:03:25

+0

名字ü可以給我查詢在ASP 正是 這是我的查詢 Lstart =「奧尼爾」; select * from搜索,其中lname類似於'%Lstart%' – 2010-03-03 06:14:45