標籤:轉義 通訊 hid eval 解決 使用者輸入 自動 沒有 外部命令
防止SQL注入
SQL(結構化查詢語言 (SQL))是基於美國國家標準局(ANSI)標準,並作為共同的語言與資料庫通訊。每個資料庫系統增加了一些專有功能到基本的ANSI SQL。
SQL注入是一門將製作好的SQL注入使用者輸入欄位的一種技術,它是網頁形式的一部分——用來繞過自訂登入到網站。然而,SQL注入也可以用於登入或者接管一個網站,因此要確保其能防止攻擊很重要。
開發人員和管理員可以採取許多不同的步驟解決SQL注入的問題。以下是為開發人員提供的解決方案:
· 過濾的所有輸入欄位單引號(‘ ),以防止未經授權的登入。
· 過濾器SQL命令的所有輸入欄位,如插入,選擇,工會,刪除和exec ,以保護伺服器操作。 (請確保操作是在過濾單引號後進行)
· 限制輸入欄位長度(這將限制攻擊者的選擇),並用伺服器端指令碼驗證輸入長度。
預存程序用處
xp_cmdshell執行資料庫電腦作業系統的外部命令
xp_sendmail從資料庫電腦發送一封郵件
xp_regaddmultistring xp_regdeletekey xp_regdeletevalue xp_regenumkeys xp_regenumvalues xp_regread xp_regremovemultistring xp_regwrite控制註冊管理的各項因素
xp_servicecontrol啟動,停止和暫停服務。可用於攻擊者停止關鍵服務或者啟用可被利用的服務,如Telnet伺服器服務。
· 使用選項來過濾“逸出字元” (用於注入SQL代碼,比如單引號) ,如果該資料庫提供了該功能。
· 除了Web 服務器,將資料庫在不同的電腦的Web伺服器上。一旦資料庫遭到駭客攻擊,也很難攻擊到Web服務期。
· 限制的伺服器端指令碼的使用者權限。從伺服器端指令碼中記錄到資料庫的通常的做法是使用系統管理使用者,但這可能同事也讓攻擊者趁機運行需要系統管理使用者的資料庫任務(如修改表或運行預存程序) 。所以用最小的使用者權限分配來達到此目的。
· 刪除所有不必要的擴充預存程序來限制攻擊者的可能性。
· 將資料庫放置到一個單獨的空間(在防火牆後面) ,與Web容器和應用伺服器相隔離。
不同於開發商,管理員沒有代碼的控制權,不能代表程式員產生變化。然而管理員可以通過運行一些測試,並確保代碼安全來降低風險:
· 確保Web伺服器給返回一個自訂錯誤頁。這樣一來,伺服器將不會返回SQL錯誤,這將使攻擊者更難獲得SQL資料。(自訂錯誤頁面不應該包含任何可能有助於攻擊者的資訊,不同於常規將返回部分SQL的錯誤頁面。)
· 只部署從Web伺服器分離資料的Web應用程式。
· 聘請外部機構對Web伺服器上執行穿透測試,並尋找SQL注入攻擊。
· 使用一個專用的自動掃描裝置來探索由程式員的失誤導致的SQL注入漏洞。
· 部署安全解決方案來驗證使用者輸入並過濾SQL注入企圖。
二、防止表單和指令碼泄密
表單用於允許使用者輸入,但也可以用來管理會話,並在會話內傳輸的重要資料(如使用者或工作階段識別項)。攻擊者可以暴露嵌入在創視窗中的資料,並通過Web應用暴露其他使用者資訊,或以較低的價格在電子商務中進行交易。3種暴露形式如下:
· 禁用用戶端指令碼
· 在URL中傳遞參數
· 通過隱藏欄位傳遞參數
1. 用戶端指令碼
一些開發人員使用用戶端指令碼來驗證各種方式輸入欄位:
· 限制輸入欄位的大小
· 禁止某些字元(如單引號)
· 執行其他類型的驗證(這些可以具體到每個網站)
通過禁用用戶端指令碼( javascript或VBScript)中,此驗證可輕鬆繞過。開發人員應該在伺服器端驗證所有欄位。這可能需要伺服器上的額外資源。
2. 通過URL傳遞參數
視窗有兩種方法來傳遞資料: post和get 。 post命令。在內容流發送資料和get命令在URL中發送資料。攻擊者可以利用get命令來發送無效或不正確的資料,或發送惡意代碼。
例如,假設我們有這樣的形式:
...
<formaction="login.asp"method="get">
<p>username:<inputtype=textname="username"/></p>
<p>password:<inputtype=passwordname=password/></p>
<p><inputtype="submit"name="submit"value="login"/></p>
</form>
...
讓我們假設使用者輸入someusername作為使用者名稱,somepassword為密碼。瀏覽器會被重新導向到這個URL
http://thesite/login.asp?username=someusername?password=somepassword
攻擊者可以通過簡單地修改URL的資料(利用此類型的URL在瀏覽器的地址欄)。這個方法可以用在電子商務網站來改變項目的價格。例如,看看下面的網址:
http://somesite/checkout.asp?totalprice=100
攻擊者可以簡單地改變“TOTALPRICE”的值,並執行檢出有以較低的價格比之意。這可以簡單地通過改變這樣的URL來完成:
http://somesite/checkout.asp?totalprice=50
Web應用程式將執行檢驗,但總價為50美元(代替了2881064151美元)。
另一種情況是,在登入後,使用者識別正在使用GET發送,讓攻擊者修改它,並在另一個使用者的名義執行操作。
攻擊者可以更改“使用者”的值,併當存在使用者的時候獲得該使用者的資料。
3. 通過隱藏欄位傳遞資料
POST在發送資料的時候使用的是HTTP命令。不同於get,這種方法不會顯示在URL中的資料,但它也更容易被利用。考慮以下表格:
...<formaction="checkout.asp"method="post"><inputtype="hidden"name="userid"value="102"/><p><inputtype="submit"name="submit"value="checkout"/></p></form>...
POST在發送資料的時候使用的是HTTP命令