MySQL 延時注入是一種利用漏洞讓應用程序在執行 SQL 查詢時出現大量延時的攻擊形式。攻擊者可通過注入惡意的 SQL 語句,讓 MySQL 數據庫在查詢過程中不斷地執行休眠(sleep)指令,從而延長整個查詢的執行時間。這種攻擊方式對于攻擊者而言是非常有效的,因為往往只需要在多次請求中增加幾秒的延時,就可以獲取服務器的敏感數據。
1
如上代碼所示,應用程序從 URL 參數中獲取查詢所需的 id 值,然后根據 id 值查詢數據庫,返回結果。當攻擊者向應用程序發送特制的 URL 參數值時,例如 "id=1; sleep(10); --",整個查詢語句將變為:
SELECT * FROM users WHERE userid = 1; sleep(10); --
當 MySQL 執行這個查詢時,它將等待 10 秒鐘,然后才結束查詢。攻擊者可以反復利用這種方式,向服務器發送大量帶有延時注入的請求,最終獲取敏感數據。
為了防止 MySQL 延時注入,應用程序開發人員需要使用預處理語句,將用戶輸入的參數值進行過濾和轉義,確保查詢語句不被惡意修改。例如:
1
使用預處理語句的好處在于它可以事先將參數值轉義,避免惡意代碼影響查詢語句。在上面的代碼中,mysqli_prepare 函數將查詢語句拆分為兩個部分,其中 ? 是一個占位符,表示在執行查詢之前需要設置一個參數。然后使用 mysqli_stmt_bind_param 函數將 $id 參數值綁定到占位符上,從而避免了延時注入的攻擊。