sql注入漏洞是由於sql語句的呼叫方法不完善而產生的安全隱患。一旦應用中存在sql注入漏洞,就可能造成如下影響。值得注意的是,以下影響中攻擊者都能夠直接對伺服器實施主動攻擊,而不需要使用者參與。
根據資料庫引擎的不同,通過sql注入攻擊還可能會達到下列效果。
sql注入攻擊能夠以開發者意想不到的方式改變sql語句的構造,其中很大程度上都是因為字面量的緣故。字面量指的是sql語句中的固定值。sql中每種資料型別都有相應的字面量,其中最常用的字串字面量和數值字面量。
字串字面量的問題:
sql標準規格中規定字串字面量必須用單引號括起來。而若要在字串字面量內使用單引號,就需要使用連續的兩個單引號來表示。這被稱為單引號轉義。
例如: abc』de字串,需要使用兩個單引號來轉義。 『abc』『de』
針對數值的sql注入攻擊:
web開發中普遍使用的指令碼語言(php,perl,puby等)多為動態型別語言,不限制變數型別。因此,理應填入數值的地方就有可能會被填入其他型別的字元。比如,假設一下sql語句中南age列的型別為整型,儲存的是年齡。
select
*from employees where age < $age;
隱患:select
*from employees where age <
1; delete
from employees;
由於數值字面量沒有用單引號圍住,所以,當出現非數值的字元時即被視為數值字面量終止。此例中,分號; 不是數值,因此分號以後的值就被排除了數值字面量,而被解釋為sql語句的一部分。
產生sql注入漏洞的根本原因為,被指定為引數的字串的一部分被排除出字面量,導致sql語句發生了變化。因此,要防止sql注入漏洞,就必須防止sql語句在拼接過程中被更改。具體可採取如下兩種方法:
使用佔位符拼接sql語句。
在應用程式中拼接sql語句時,要確保字面量被正確處理,sql語句不可被更改。
由於第二種方法的實施非常困難,因此常用第一種方式。
使用靜態佔位符。
靜態佔位符的繫結變數操作在資料庫引擎中執行。含有佔位符的sql語句被直接傳送至資料庫引擎,資料庫引擎執行編譯等準備工作後確定sql。歲後繫結值也被傳送至資料庫引擎,資料庫引擎將收到的值填充進sql語句後將其執行。
由於sql語句是在包含佔位符的狀態下編譯的,因此從理論上來說,之後sql語句就不可能再被改變。
動態佔位符:
動態佔位符的方式為,首先在處理sql的程式庫中執行繫結變數操作,然後再將sql語句傳送給資料庫引擎處理。繫結變數是字面量會被妥善處理,因此只要處理中沒有bug就不會遭受sql注入攻擊。
靜態和動態佔位符:
無論使用靜態還是動態佔位符都能消除sql注入漏洞。但就理論上來說,靜態佔位符能夠完全消除sql注入漏洞出現的可能性,所以應當盡可能地採用靜態佔位符。
學習過程中筆記的記錄與資料整理。
sql注入學習筆記
1.什麼是sql注入 sql注入就是指web應用程式對使用者輸入的資料的合法性沒有判斷,前端傳入後端的引數帶有資料庫查詢的語句,攻擊者可以構造不同的sql語句來實現對資料庫的操作。2.sql注入原理 sql注入漏洞產生需要滿足以下兩個條件。引數使用者可控,前端傳給後端的引數內容是使用者可以控制的 引...
Sql 注入 學習筆記
先了解下crlf,crlf常用在分隔符之間,cr是carriage retum ascii 13,r lf是line feed ascii 10,n r n這兩個字元類似於回車是用於換行的,因此該漏洞可能會導致程式原有的語義被改變 如 def helloworld name open test a ...
SQL注入學習筆記(2)
在做題時的一些總結 注釋 1.單行注釋 mysql中 也可以 注意 瀏覽器url中 有特殊作用,不一定能用 2.多行注釋 3.注 號在語句中變成了空格。用來和後面的單引號分隔開,將後面的語句注釋。了解原理後便知道了 無法使用的原因,是因為 與後面的單引號連線在一起,無法形成有效的mysql語句 後面...