大白話講解SQL注入

先看一副有趣的漫畫

這幅畫就是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注入的解釋了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章