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