MySQL參數注入是在web應用程序中常見的一種安全漏洞。它是一種攻擊方式,攻擊者通過構造特殊的參數,來欺騙應用程序將一些可執行的SQL代碼插入到SQL語句中,并成功執行SQL腳本。
例如以下SQL語句: SELECT * FROM users WHERE username='admin' AND password='123456'; 可以通過下面的參數來注入: username=admin'-- - password=xxx 利用-- -注釋掉后面的代碼,使得語句變成: SELECT * FROM users WHERE username='admin'-- -' AND password='xxx'; 從而讓系統將密碼參數進行忽略,達到隨意控制數據庫的效果。
為了避免這類攻擊,我們需要在開發過程中對參數進行過濾和轉義。最好的方式是使用參數化語句。如果不得不用字符串拼接方式,就需要使用轉義方法對參數進行處理。
例如PHP中使用mysqli_real_escape_string來對參數進行過濾。 $username=mysqli_real_escape_string($conn,$_POST['username']); $password=mysqli_real_escape_string($conn,$_POST['password']); 再進行字符串拼接 $sql="SELECT * FROM users WHERE username='".$username."' AND password='".$password."'";
使用參數化語句時,開發者只需傳入參數,MySQL自動將參數值替換到SQL語句中,而不是將參數作為字符串拼接在SQL語句中。
例如PDO中的方式 $stmt = $dbh->prepare("SELECT * FROM users WHERE username = ? AND password = ?"); $stmt->execute(array($username, $password));
在使用參數化語句的情況下,參數會自動進行轉義,能夠防止參數注入漏洞的產生。