MySQL中的模糊查詢(like語句)由于其匹配字符串的模糊性,容易被黑客利用進行注入攻擊。例如,傳入一個特殊字符集“%' --”。這種輸入會將like語句解析為“like '%'--”,從而忽略后面的內容,使查詢變得不安全。
為了解決這個問題,我們需要對輸入內容進行過濾和檢查,防止SQL注入攻擊的發生。下面我們使用PHP語言作為例子進行講解:
$name = $_GET['name']; $name = mysql_real_escape_string($name); //過濾特殊字符 $name = addslashes($name); //轉義特殊字符 $query = "SELECT * FROM users WHERE username LIKE '%$name%'"; mysql_query($query);
在以上代碼中,我們使用了mysql_real_escape_string函數對$name進行過濾,轉義$name字符串中的特殊字符,例如'、"、\等,從而避免對SQL語句的篡改。同時,我們還使用了addslashes函數對$name進行轉義,使$name字符串中的特殊字符不會被解析為SQL語句的一部分。
除此之外,我們還可以使用預處理語句(prepared statement)進行防注入處理。預處理語句是一種先將SQL語句和參數分開處理的方法,避免了SQL注入攻擊。下面是使用預處理語句進行防注入處理的代碼:
$name = $_GET['name']; $query = $mysqli->prepare("SELECT * FROM users WHERE username LIKE ?"); $name = '%' . $name . '%'; $query->bind_param('s', $name); $query->execute();
以上代碼中,我們使用了mysqli庫的預處理語句功能,將$name參數和LIKE語句分開處理。通過調用bind_param綁定參數,將$name值傳入預處理語句,從而避免了因$name字符串中包含特殊字符而引起的注入攻擊。