您好,登錄后才能下訂單哦!
本篇文章給大家分享的是有關(guān)SQL中 Injection的作用是什么,小編覺得挺實用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
SQL Injection,SQL 注入,其實就是利用代碼漏洞改變 SQL 的語意,從而形成惡意 SQL 語句
$username = $_POST['username']; $password = $_POST['password']; $query = "select * from users where username = '{$username}' and password = '{$password}'"; // 判斷是否登錄成功 if (DB::select($query)) { return true; } return false;
咋一看這段偽代碼沒啥問題,就是判斷賬號密碼是否正確,正確就返回 true,允許登錄。但是如果傳入的 username 為 123' or 1=1;#\,那么 SQL 語句就變?yōu)榱?/p>
select * from users where username = '123' or 1=1; # and password = '{$password}'";
這條惡意的 SQL 語句無論何時都會返回 true,因為 1=1
我們前面講過 SQL Injection 就是利用代碼漏洞改變 SQL 的語意,意味著 ORM 也是一個潛在的注入點。以 tp3.2 為例,有下面這段代碼
$result = D('User')->where([ 'username' => $_POST['username'], 'password' => $_POST['password'], ]); if ($result) { echo '登錄成功'; } else { echo '登錄失敗'; }
這段代碼咋看起來沒啥問題,但是如果 username 傳入的是 username[0]=neq&username[1]=1111,這樣就是的查詢語句變?yōu)?/p>
$result = D('User')->where([ 'username' => ['neq', 111], 'password' => $_POST['password'], ]);
那么 $result 的結(jié)果將永遠(yuǎn)為 true
對傳入的參數(shù)進(jìn)行數(shù)據(jù)類型判斷和數(shù)據(jù)類型轉(zhuǎn)換
對引號進(jìn)行轉(zhuǎn)義,PHP 可以使用 addslashes,mysql_real_escape_string 等函數(shù)
預(yù)處理語句,最有效防范 SQL Injection
代碼審計
預(yù)處理語句是由數(shù)據(jù)庫實現(xiàn)的,比如 MySQL 就有實現(xiàn)預(yù)處理語句。首先講下預(yù)處理的基本流程
MySQL 接收到 預(yù)處理 SQL Template,立刻著手進(jìn)行解析(詞法和語法)
客戶端發(fā)送數(shù)據(jù),去替換 SQL Template 中的占位符(?)
MySQL 執(zhí)行語句,返回結(jié)果
刪除預(yù)處理語句(可選)
那么預(yù)處理語句是如何防范 SQL 注入的呢?首先所謂的 SQL Injection 就是強(qiáng)行去改變 SQL 語意。而在步驟一中已經(jīng)處理完成語句,將 SQL 的語意固定下來,步驟二的替換占位符并不會改變 SQL 語意。下面是 PHP PDO 的例子
$stmt = $pdo->prepare("select * from users where username = '?' and password = '?'"); $stmt->execute("123' or 1=1;#", 'test');
以上就是SQL中 Injection的作用是什么,小編相信有部分知識點可能是我們?nèi)粘9ぷ鲿姷交蛴玫降?。希望你能通過這篇文章學(xué)到更多知識。更多詳情敬請關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。