MySQL - SQL 注入



MySQL 中的 SQL 注入是一種有害的方法,攻擊者透過這種方法將有害的 SQL 程式碼插入或“注入”到資料庫查詢中。這可以透過使用者輸入(例如表單、URL 引數或 Cookie)來完成。攻擊者利用軟體中的弱點從資料庫中竊取資訊。

SQL 注入是如何工作的

假設您有一個帶有登入頁面的 Web 應用程式。當用戶輸入其使用者名稱和密碼時,應用程式會將這些憑據與 MySQL 資料庫中的憑據進行比較。SQL 查詢可能如下所示:

SELECT * FROM users 
WHERE username = 'user' AND password = 'password';

在安全的應用程式中,“使用者”和“密碼”將是使用者實際輸入的值。但是,在 SQL 注入攻擊中,攻擊者可以操縱輸入欄位以注入惡意 SQL 程式碼。

例如,他們可能會輸入以下內容作為使用者名稱:

' OR '1' = '1

現在,SQL 查詢變為:

SELECT * FROM users 
WHERE username = '' OR '1' = '1' AND password = 'password';

因為“1”始終等於“1”,所以此條件始終為真,攻擊者可以未經授權訪問應用程式。透過這種方式,他們誘使應用程式在沒有有效密碼的情況下授予訪問許可權。

防止 SQL 注入

為了防止 SQL 注入,在使用 PERL 和 PHP 等指令碼語言時,正確處理跳脫字元非常重要。在使用 PHP 和 MySQL 時,您可以使用 **mysql_real_escape_string()** 函式轉義在 MySQL 中具有特殊含義的輸入字元。以下是如何執行此操作的示例:

if (get_magic_quotes_gpc()) {
   $name = stripslashes($name);
}
// escape input characters
$name = mysql_real_escape_string($name);

// Perform the MySQL query with the escaped 'name'
mysqli_query("SELECT * FROM CUSTOMERS WHERE name='{$name}'");

LIKE 子句的難題

現在,讓我們解決 LIKE 子句的問題。在處理可能包含“%”和“_”字元的使用者提供的資料時,建立自定義轉義機制以將其視為字面量非常重要。您可以透過將“mysql_real_escape_string()”函式與“addcslashes()”函式結合使用來實現此目的,該函式允許您指定要轉義的字元範圍。以下是如何執行此操作的示例:

// Escape and convert '%' and '_' in the user-provided string
$sub = addcslashes(mysql_real_escape_string("%str"), "%_");

// $sub will be equal to \%str\_

// Use the escaped string in the LIKE query
mysqli_query("SELECT * FROM messages 
   WHERE subject LIKE '{$sub}%'");

透過這種方式,您可以確保使用者輸入中的“%”和“_”字元在 SQL 查詢中被視為字面字元,從而防止 SQL 注入並維護資料庫操作的完整性。

廣告