首頁 > 科技週邊 > IT業界 > 如何保護您的網站免受SQL注入攻擊

如何保護您的網站免受SQL注入攻擊

Lisa Kudrow
發布: 2025-02-18 09:09:09
原創
918 人瀏覽過

How to Protect Your Website Against SQL Injection Attacks

SQL注入攻擊:關鍵要點

SQL注入攻擊是一種嚴重的網站安全威脅,攻擊者利用網站輸入通道中的漏洞來攻擊其數據庫,可能竊取或更改數據、破壞功能或獲得管理訪問權限。

為了防止SQL注入攻擊,切勿信任用戶輸入,始終驗證其是否存在潛在的攻擊模式。這不僅包括文本輸入,還包括隱藏輸入、查詢字符串參數、Cookie和文件上傳。

應在服務器端驗證用戶輸入,以確保其類型正確,並消除任何潛在的惡意命令。這可以通過多種方法實現,例如:為可能更改SQL命令的輸入添加轉義字符,或使用命令參數替換SQL命令中的用戶輸入。

定期檢查網站代碼是否存在潛在漏洞至關重要,做好SQL注入攻擊的應急準備同樣重要。限制潛在損害的措施包括:避免使用管理員權限、加密敏感數據以及除非絕對必要,否則不要存儲敏感數據。

其他保護措施包括:對讀寫數據庫操作使用單獨的連接、將用戶帳戶訪問權限限制在特定IP地址範圍內、在MS SQL Server中使用Windows身份驗證模型以及使用SHA-2等強算法進行密碼哈希。

How to Protect Your Website Against SQL Injection Attacks

感謝Chris Lienert和Guido Tonnaer的幫助審閱本文。

在針對網站的所有攻擊中,SQL注入是最危險和最普遍的一種,在過去一年中已被用於對企業和組織造成實際損害。該方案已被用於攻擊知名組織和公司,包括TalkTalk、VTech、《華爾街日報》和美國政府。

簡而言之,SQL注入(也稱為SQLi)利用網站輸入通道中的漏洞來攻擊Web應用程序後端的數據庫,其中存儲著最敏感和最有價值的信息。攻擊者可以使用此方案來竊取或篡改數據、妨礙應用程序功能,並在最壞的情況下獲得對數據庫服務器的管理訪問權限。

以下是您需要了解的關於SQL注入以及如何保護您的網站免受其攻擊的信息。

SQL注入攻擊的工作原理

SQL注入攻擊是通過Web請求向數據庫服務器發送惡意SQL命令來進行的。任何輸入通道都可以用來發送惡意命令,包括表單元素、查詢字符串、Cookie和文件。

要了解其工作原理,假設您有一個接受用戶名和密碼的登錄表單:

How to Protect Your Website Against SQL Injection Attacks

當用戶輸入其憑據並按下“登錄”按鈕時,信息將被發布回您的Web服務器,並與SQL命令組合在一起。例如,在PHP中,代碼如下所示:

$sql_command = "select * from users where username = '" . $_POST['username']; 
$sql_command .= "' AND password = '" . $_POST['password'] . "'"; 
登入後複製
登入後複製
登入後複製

然後,該命令將被發送到數據庫服務器,生成的dataset將確定用戶名和密碼是否與有效的用戶帳戶相對應。平均用戶輸入“john”作為用戶名和“123456”作為密碼(順便說一句,切勿使用該密碼)將轉換為以下命令:

SELECT * FROM users WHERE username='john' AND password='123456' 
登入後複製
登入後複製
登入後複製

但如果用戶決定嘗試其他內容,例如以下內容:

How to Protect Your Website Against SQL Injection Attacks

生成的命令將如下所示,它將始終返回非空dataset:

SELECT * FROM users WHERE username='john' OR 1=1; -- ' AND password='123456' 
登入後複製
登入後複製

此代碼片段可能會允許用戶繞過登錄屏幕而無需擁有正確的憑據。

這是最簡單的SQL注入形式之一。只需付出更多努力,同一個用戶就可以插入新的用戶帳戶,以及刪除或修改現有用戶帳戶。在顯示結果的頁面中,可以使用相同的方案來顯示本來僅限於普通訪問者查看的記錄和信息,或更改記錄的內容。

在更嚴重的情況下,如果通過管理員帳戶(例如MySQL中的“root”或MS SQL Server中的“sa”)連接到數據庫服務器,攻擊者甚至可以完全破壞服務器的操作系統。在Windows服務器上,這可能表現為攻擊者執行擴展存儲過程,例如xp_cmdshell。在一個案例中,攻擊者利用SQL注入漏洞在受感染的服務器上創建用戶帳戶、啟用遠程桌面功能、設置SMB共享文件夾並上傳惡意軟件——除了實際上弄亂數據庫中存儲的所有內容之外。

如何保護自己免受SQL注入攻擊

由於用戶輸入通道是SQL注入攻擊的主要媒介,因此大多數防禦方法都涉及控制和審查用戶輸入是否存在攻擊模式。

以下是一些可以確保用戶輸入安全的措施。

切勿信任用戶輸入

關於用戶輸入的首要規則是“不信任並驗證”,這意味著所有形式的用戶輸入都應被視為惡意,除非證明並非如此。這不僅適用於簡單的輸入框,例如文本區域和文本框,還適用於所有其他內容——例如隱藏輸入、查詢字符串參數、Cookie和文件上傳。

僅僅因為瀏覽器的用戶界面不允許用戶操作輸入,並不意味著無法篡改它。諸如Burp Suite之類的簡單工具使用戶能夠捕獲HTTP請求並在將其提交到服務器之前修改任何內容,包括隱藏的表單值。如果您認為自己通過Base64編碼數據很聰明,惡意用戶可以輕鬆地對其進行解碼、修改和重新編碼。

在服務器端驗證輸入字符串

驗證是確保用戶提供正確類型的輸入並消除可能嵌入在輸入字符串中的任何潛在惡意命令的過程。例如,在PHP中,您可以使用mysql_real_escape_string()來轉義可能改變SQL命令性質的字符。

前面提到的登錄代碼的修改版本如下所示:

$sql_command = "select * from users where username = '" . $_POST['username']; 
$sql_command .= "' AND password = '" . $_POST['password'] . "'"; 
登入後複製
登入後複製
登入後複製

此簡單的修改將通過在惡意用戶故意添加的單引號前面添加轉義字符()來保護您的代碼免受攻擊。

關於驗證的一點說明:如果您添加了客戶端驗證函數,做得很好。但是不要將其依賴為針對SQL注入攻擊的防禦措施。雖然客戶端函數可能會使向您的服務器發送惡意輸入變得更難,但它很容易通過一些瀏覽器調整和諸如前面提到的工具來規避。因此,您需要用服務器端驗證來補充它。

一些編程平台(例如ASP.NET)包含內置功能,這些功能會在頁面回發時自動評估用戶輸入是否存在惡意內容。但是黑客可以通過足夠的技巧和細緻來規避它們,因此您仍然應該通過您自己的安全檢查程序來運行用戶輸入。您永遠不會過於謹慎。

使用命令參數

比轉義更好的替代方法是使用命令參數。命令參數是通過在SQL命令中添加佔位符名稱來定義的,這些佔位符名稱稍後將被用戶輸入替換。 ASP.NET為此目的提供了一組非常直觀且易於使用的API。

以下是用C#編寫的代碼顯示瞭如何使用命令參數來保護您的網站免受SQL注入攻擊:

SELECT * FROM users WHERE username='john' AND password='123456' 
登入後複製
登入後複製
登入後複製

您首先創建一個SqlCommand對象,並在命令字符串中使用@parameter_name範例,用戶輸入應插入到該範例中。

然後,您創建SqlParameter對象的實例,在其中插入用戶輸入,而不是直接將其與命令字符串連接起來。

最後,您將SqlParameter對象添加到SqlCommand對象的Parameters集合中,該集合將使用提供的輸入替換參數。 ADO.net負責其餘工作。

在PHP中,等效項是預處理語句,它比其ASP.net對應項更複雜一些。您可以在這裡探索它。

顯式轉換您的輸入

此技巧適用於PHP等弱類型語言,這意味著您通常不會為變量定義數據類型,並且語言會自動處理彼此之間不同數據類型的轉換。

顯式轉換可以作為在涉及非字符串類型時轉義輸入的快捷方式。因此,如果您希望用戶為age參數輸入一個int,您可以使用PHP中的以下代碼來確保輸入的安全:

SELECT * FROM users WHERE username='john' OR 1=1; -- ' AND password='123456' 
登入後複製
登入後複製

請注意,此代碼片段僅驗證輸入的類型,而不是其範圍。因此,您必須運行其他代碼以確保用戶不會輸入負年齡——或不切實際的年齡,例如1300。

此外,另一個最佳實踐是避免在涉及非字符串輸入的SQL命令中使用單引號。因此,不要使用以下代碼……

$sql_command = "select * from users where username = '" . $_POST['username']; 
$sql_command .= "' AND password = '" . $_POST['password'] . "'"; 
登入後複製
登入後複製
登入後複製

……使用以下代碼會更安全一些:

SELECT * FROM users WHERE username='john' AND password='123456' 
登入後複製
登入後複製
登入後複製

如何根除SQL注入漏洞

作為一般做法,您應該檢查每個頁面的代碼,查看您將頁面內容、命令、字符串等與可能來自用戶的來源組合在一起的地方。檢查您的源代碼是否存在漏洞和安全漏洞應該是軟件開發過程中的一個固有部分。

您還可以使用sqlmap等掃描工具來抓取網站的頁面,查找潛在的SQL注入漏洞。事實上,黑客經常使用此工具來查找和利用目標網站上的SQL注入攻擊媒介,那麼為什麼不使用它來提高其安全性呢?

您的最後一道防線

無論您如何加強網站的安全,您都必須為SQL注入確實發生的那一天做好準備。畢竟,正如網絡安全行業中眾所周知的那樣,防御者必須贏得每一場戰鬥,但黑客只需要贏一次。

以下是一些提示,可以幫助您在成為SQL注入受害者時最大限度地減少損害。

避免管理員權限

使用“root”或“sa”帳戶將您的Web應用程序連接到數據庫服務器是您可以犯下的最嚴重的錯誤之一。正如我已經提到的那樣,被破壞的管理員帳戶可能會讓黑客訪問整個系統。即使是非管理員帳戶也可能造成損害,這些帳戶可以訪問服務器中的所有數據庫,尤其是在數據庫服務器在不同的應用程序和數據庫之間共享時。

因此,最好使用一個帳戶,該帳戶僅對位於網站後端的特定數據庫具有簡單的讀寫權限,因此,如果您的網站通過SQL注入被黑客入侵,損害範圍將僅限於該單個數據庫的範圍內。

一種更高級的方法是為從數據庫讀取或寫入數據庫的代碼段使用單獨的連接,並進一步減少每個段的權限和角色。例如,列表頁面(不修改數據庫,但廣泛使用搜索參數)可以使用只讀連接到數據庫進行編碼,以便進一步增強代碼的抗故障能力。

在MySQL中,通過將對用戶帳戶的訪問限制在特定的IP地址範圍內(而不是“%”模型)來提高安全性,以防止從遠程位置訪問受損帳戶。

在MS SQL Server中,我強烈建議您使用Windows身份驗證模型,這將限制黑客對數據庫的訪問,並確保他們無法使用其他通道進入您的數據庫。

此外,除非您計劃使用SQL Server的一些高級功能,否則最好將Windows服務設置為使用受限帳戶,而不是高權限的“本地系統”帳戶。如果“sa”帳戶被破壞,這將最大限度地減少損害。

加密敏感數據

加密數據庫中的敏感數據。這包括密碼、安全問題和答案、財務數據、健康信息以及其他可能對惡意行為者有用的信息。這將確保即使黑客掌握了您的數據,他們也無法立即利用它,這為您提供了時間來發現漏洞、堵塞漏洞並採取其他反應措施,例如強制重置密碼,這將確保被盜數據在攻擊者破譯之前失去其價值。

如果您正在對密碼進行哈希處理,請使用SHA-2等強算法,這很快將成為密碼保護的行業標準。 MD5和SHA-1已過時,可以被反轉。

對於其他形式的加密,請注意您存儲密鑰的位置,切勿孤注一擲。如果密鑰就在加密數據旁邊,並且黑客一旦破壞服務器就會輕鬆訪問它們,那麼使用加密就沒有意義了。

如果不需要,請不要存儲敏感數據

每當您在數據庫中存儲信息時,請考慮如果信息落入壞人之手會造成多大的損害,並決定您是否真的需要存儲它。 Ashley Madison黑客事件將約3700萬人的黑暗秘密和最私密信息洩露到互聯網上,並造成了一些嚴重的損害,其成功部分歸因於提供商沒有從其數據庫中刪除敏感信息。

因此,底線是,除非您確實必須這樣做,否則不要在數據庫中存儲敏感信息。即使那樣,也要在信息不再有用時將其刪除。

最終想法

SQL注入已經存在了幾十年,並且可能會在未來幾年繼續佔據漏洞排行榜的榜首。它只需要幾個簡單的——但經過精心計算的——步驟來保護您和您的用戶免受其侵害,並且在審核源代碼是否存在安全漏洞時,它應該是您的首要任務之一。

避免成為下一個大型SQL注入數據洩露事件受害者的關鍵是:首先,控制和驗證用戶輸入;其次,為“何時”做好準備,而不是“是否”。

關於保護您的網站免受SQL注入攻擊的常見問題解答(FAQ)

保護我的網站免受SQL注入攻擊的第一步是什麼?

保護您的網站免受SQL注入攻擊的第一步是了解什麼是SQL注入。 SQL注入是一種代碼注入技術,攻擊者使用它將惡意SQL語句插入輸入字段以進行執行。這可能導致未經授權訪問敏感數據、數據丟失甚至數據損壞。一旦您了解了這一點,您就可以實施諸如輸入驗證、參數化查詢和使用存儲過程等措施來保護您的網站。

輸入驗證如何幫助防止SQL注入攻擊?

輸入驗證是一種定義用戶輸入的語法、內容和邏輯值的方法。通過這樣做,您可以防止攻擊者將惡意SQL代碼插入到網站的輸入字段中。這是因為輸入驗證過程將拒絕任何不符合已定義條件的輸入。

參數化查詢是什麼?它們如何防止SQL注入攻擊?

參數化查詢是一種SQL查詢,其中使用佔位符表示值,而值本身是在執行時提供的。這意味著即使攻擊者試圖插入惡意SQL代碼,它也會被視為文字字符串,而不是SQL命令的一部分。這有效地防止了SQL注入攻擊。

存儲過程如何幫助防止SQL注入攻擊?

存儲過程是存儲在數據庫中並可以由應用程序調用的SQL語句。它們可以幫助防止SQL注入攻擊,因為它們不允許直接訪問數據庫。相反,它們使用不被執行為SQL命令的參數,從而防止任何注入的SQL代碼被執行。

錯誤處理在防止SQL注入攻擊中起什麼作用?

正確的錯誤處理可以通過不透露有關數據庫結構或SQL語法的任何信息來幫助防止SQL注入攻擊。這是因為當發生錯誤時,錯誤消息可以為攻擊者提供有關數據庫結構或SQL語法的線索,然後他們可以使用這些線索來改進其攻擊。

我如何使用最小權限原則來保護我的網站免受SQL注入攻擊?

最小權限原則意味著只為用戶帳戶或進程提供執行其預期功能所必需的權限。例如,如果用戶帳戶只需要從數據庫讀取數據,則無需授予其寫入訪問權限。這可以通過限制攻擊者在設法利用漏洞時可以執行的操作來幫助防止SQL注入攻擊。

定期更新在防止SQL注入攻擊中起什麼作用?

定期更新對於防止SQL注入攻擊非常重要,因為它們通常包含針對已知漏洞的補丁。通過使您的軟件保持最新,您可以確保您免受可能被SQL注入攻擊利用的已知漏洞的侵害。

我如何使用Web應用程序防火牆來保護我的網站免受SQL注入攻擊?

Web應用程序防火牆(WAF)可以通過過濾和監控Web應用程序和Internet之間的HTTP流量來幫助保護您的網站免受SQL注入攻擊。它可以通過檢測HTTP請求中的惡意SQL代碼來識別和阻止SQL注入攻擊。

入侵檢測系統在防止SQL注入攻擊中起什麼作用?

入侵檢測系統(IDS)可以通過監控網絡流量並檢測可疑活動來幫助防止SQL注入攻擊。如果IDS檢測到潛在的SQL注入攻擊,它可以提醒管理員甚至採取措施阻止攻擊。

我如何使用加密來保護我的網站免受SQL注入攻擊?

加密可以通過使攻擊者更難以讀取敏感數據來幫助保護您的網站免受SQL注入攻擊。即使攻擊者設法利用SQL注入漏洞,他們仍然需要解密數據才能使用它。

以上是如何保護您的網站免受SQL注入攻擊的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板