先看一副有趣的漫畫
這幅畫就是sql注入的精華了。
什麼是SQL注入:
SQL注入是一種非常常見的數據庫攻擊手段,SQL注入漏洞也是網絡世界中最普遍的漏洞之一。大家也許都聽過某某學長通過攻擊學校數據庫修改自己成績的事情,這些學長們一般用的就是SQL注入方法。
SQL注入其實就是惡意用戶通過在表單中填寫包含SQL關鍵字的數據來使數據庫執行非常規代碼的過程。簡單來說,就是數據「越俎代庖」做了代碼才能乾的事情。
這個問題的來源是,SQL數據庫的操作是通過SQL語句來執行的,而無論是執行代碼還是數據項都必須寫在SQL語句之中,這就導致如果我們在數據項中加入了某些SQL語句關鍵字(比如說SELECT、DROP等等),這些關鍵字就很可能在數據庫寫入或讀取數據時得到執行。
下面就舉一個例子來看看。
比如我們用java來寫一個管理系統,我們就叫學生管理系統吧,這個時候我們要做什麼事情呢?
我們要做這樣一個系統肯定會少不了跟數據庫交互,那麼我們假設
Class.forName("com.mysql.jdbc.Driver");
// 聲明數據庫view的URL
String url = "jdbc:mysql://localhost:3306/view?useUnicode=true&characterEncoding=utf-8&useSSL=false";
// 數據庫用戶名
String user = "root";
// 數據庫密碼
String password = "123456";
// 建立數據庫連接,獲得連接對象conn
Connection conn = DriverManager.getConnection(url, user, password);
String name="Jacck";
String sql = String.format("insert into student(username) values('%s')",name); // 生成一條sql語句
// 創建一個Statment對象
PreparedStatement ps = conn.prepareStatement(sql);
// 執行sql語句
ps.executeUpdate();
假設我們已經建好了一個數據庫,我們創建了一個student表,那麼我們上面的語句就是插入了一條語句。
那麼SQL注入又是怎麼一回事呢?我們嘗試再插入一條惡意數據,數據內容就是漫畫中的"Robert');DROP TABLE students;--",看看會發生什麼情況。
我們執行完代碼後,你會發現並沒有任何結果顯示:
你將會發現,運行後,程序沒有輸出任何數據內容,而是返回一條錯誤信息:表單students無法找到!
這是爲什麼呢?問題就在於我們所插入的數據項中包含SQL關鍵字DROP TABLE,這兩個關鍵字的意義是從數據庫中清除一個表單。
而關鍵字之前的Robert');使得SQL執行器認爲上一命令已經結束,從而使得危險指令DROP TABLE得到執行。
也就是說,這段包含DROP TABLE關鍵字的數據項使得原有的簡單的插入姓名信息的SQL語句:
INSERT INTO students (username) VALUES ('Robert')
變爲了同時包含另外一條清除表單命令的語句:
INSERT INTO students (username) VALUES ('Robert');DROP TABLE students;
而SQL數據庫執行上述操作後,students表單被清除,因而表單無法找到,所有數據項丟失。
以上就是SQL注入的解釋了。