成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

舉世聞名的 SQL 注入是什么?這個漫畫告訴你!

數據庫 SQL Server
相信大家對于學校們糟糕的網絡環境和運維手段都早有體會,在此就不多做吐槽了。今天我們來聊一聊 SQL 注入相關的內容。

先來看一副很有意思的漫畫:

相信大家對于學校們糟糕的網絡環境和運維手段都早有體會,在此就不多做吐槽了。今天我們來聊一聊 SQL 注入相關的內容。

何謂 SQL 注入

SQL 注入是一種非常常見的數據庫攻擊手段,SQL 注入漏洞也是網絡世界中最普遍的漏洞之一。大家也許都聽過某某學長通過攻擊學校數據庫修改自己成績的事情,這些學長們一般用的就是 SQL 注入方法。

SQL 注入其實就是惡意用戶通過在表單中填寫包含 SQL 關鍵字的數據來使數據庫執行非常規代碼的過程。簡單來說,就是數據「越俎代庖」做了代碼才能干的事情。

這個問題的來源是,SQL 數據庫的操作是通過 SQL 語句來執行的,而無論是執行代碼還是數據項都必須寫在 SQL 語句之中,這就導致如果我們在數據項中加入了某些 SQL 語句關鍵字(比如說 SELECT、DROP 等等),這些關鍵字就很可能在數據庫寫入或讀取數據時得到執行。

多言無益,我們拿真實的案例來說話。下面我們先使用 SQLite 建立一個學生檔案表。

SQL 數據庫操作示例:

  1. import sqlite3 
  2. conn = sqlite3.connect('test.db'
  3. conn.executescript('''DROP TABLE IF EXISTS students; 
  4.        CREATE TABLE students 
  5.        (id INTEGER PRIMARY KEY AUTOINCREMENT, 
  6.        name TEXT NOT NULL);''') 
  7. students = ['Paul','Tom','Tracy','Lily'
  8.  
  9. for name in students: 
  10.     query = "INSERT INTO students (name) VALUES ('%s')" % (name
  11.     conn.executescript(query); 
  12. cursor = conn.execute("SELECT id, name from students"
  13. print('IDName'
  14. for row in cursor
  15.     print('{0}{1}'.format(row[0], row[1])) 
  16.  
  17. conn.close() 

點擊運行按鈕將會打印目前表中的內容。上述程序中我們建立了一個 test.db 數據庫以及一個 students 數據表,并向表中寫入了四條學生信息。

那么 SQL 注入又是怎么一回事呢?我們嘗試再插入一條惡意數據,數據內容就是漫畫中的 "Robert');DROP TABLE students;--",看看會發生什么情況。

SQL 數據庫注入示例:

  1. conn = sqlite3.connect('test.db'
  2. name = "Robert');DROP TABLE students;--" 
  3. query = "INSERT INTO students (name) VALUES ('%s')" % (name
  4.  
  5. conn.executescript(query) 
  6. cursor = conn.execute("SELECT id, name from students"
  7. print('IDName'
  8. for row in cursor
  9.     print('{0}{1}'.format(row[0], row[1])) 
  10.  
  11. conn.close() 

你將會發現,運行后,程序沒有輸出任何數據內容,而是返回一條錯誤信息:表單 students 無法找到!

這是為什么呢?問題就在于我們所插入的數據項中包含 SQL 關鍵字 DROP TABLE,這兩個關鍵字的意義是從數據庫中清除一個表單。

而關鍵字之前的 Robert'); 使得 SQL 執行器認為上一命令已經結束,從而使得危險指令 DROP TABLE 得到執行。

也就是說,這段包含 DROP TABLE 關鍵字的數據項使得原有的簡單的插入姓名信息的 SQL 語句:

  1. INSERT INTO students (nameVALUES ('Robert'
  2. INSERT INTO students (nameVALUES ('Robert');DROP TABLE students; 

而 SQL 數據庫執行上述操作后,students 表單被清除,因而表單無法找到,所有數據項丟失。

如何防止 SQL 注入問題呢?

大家也許都想到了,注入問題都是因為執行了數據項中的 SQL 關鍵字,那么,只要檢查數據項中是否存在 SQL 關鍵字不就可以了么?

的確是這樣,很多數據庫管理系統都是采取了這種看似『方便快捷』的過濾手法,但是這并不是一種根本上的解決辦法,如果有個美國人真的就叫做『Drop Table』呢?你總不能逼人家改名字吧。

合理的防護辦法有很多。首先,盡量避免使用常見的數據庫名和數據庫結構。在上面的案例中,如果表單名字并不是 students,則注入代碼將會在執行過程中報錯,也就不會發生數據丟失的情況——SQL 注入并不像大家想象得那么簡單,它需要攻擊者本身對于數據庫的結構有足夠的了解才能成功,因而在構建數據庫時盡量使用較為復雜的結構和命名方式將會極大地減少被成功攻擊的概率。

使用正則表達式等字符串過濾手段限制數據項的格式、字符數目等也是一種很好的防護措施。理論上,只要避免數據項中存在引號、分號等特殊字符就能很大程度上避免 SQL 注入的發生。

另外,就是使用各類程序文檔所推薦的數據庫操作方式來執行數據項的查詢與寫入操作,比如在上述的案例中,如果我們稍加修改,首先使用 execute() 方法來保證每次執行僅能執行一條語句,然后將數據項以參數的方式與 SQL 執行語句分離開來,就可以完全避免SQL 注入的問題,如下 SQL 數據庫反注入示例。

  1. conn = sqlite3.connect('test.db'
  2. name = "Robert');DROP TABLE students;--" 
  3. query = "INSERT INTO students (name) VALUES (?)" 
  4.  
  5. conn.execute(query, [name]) 
  6. cursor = conn.execute("SELECT id, name from students"
  7. print('IDName'
  8. for row in cursor
  9.     print('{0}{1}'.format(row[0], row[1])) 
  10.  
  11. conn.close() 

而對于 PHP 而言,則可以通過 mysql_real_escape_string 等方法對 SQL 關鍵字進行轉義,必要時審查數據項目是否安全來防治SQL 注入。

當然,做好數據庫的備份,同時對敏感內容進行加密永遠是最重要的。某些安全性問題可能永遠不會有完美的解決方案,只有我們做好最基本的防護措施,才能在發生問題的時候亡羊補牢,保證最小程度的損失。

 

責任編輯:未麗燕 來源: Java專欄
相關推薦

2019-11-28 08:59:03

SQL注入網絡攻擊網絡安全

2012-07-03 16:56:12

Hadoop

2021-01-19 14:43:05

數據

2011-08-01 14:33:44

SQL

2019-07-24 11:21:18

Node.jsHTMLCSS

2019-12-09 17:31:00

華為云

2015-06-09 14:49:38

2022-04-29 08:00:36

web3區塊鏈比特幣

2021-02-27 10:38:56

Python結構數據

2019-07-09 14:49:42

SaaS軟件云計算

2018-03-29 10:19:45

2021-01-15 07:44:21

SQL注入攻擊黑客

2020-12-08 08:14:11

SQL注入數據庫

2021-11-08 13:05:54

SQL

2014-10-16 09:30:31

RFID

2015-06-15 10:10:56

2021-09-26 05:41:13

數字困境IT領導數字轉型

2021-09-26 20:22:58

5GAI技術

2009-06-12 13:59:04

2020-03-03 17:00:58

HDFS存儲數據
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 中文字幕在线网 | 国产精品久久久久久久久免费相片 | 操操日 | 午夜视频在线 | 9191av| 欧美日韩精品在线免费观看 | 狠狠的操 | 天天综合日日夜夜 | 九九亚洲 | 国产精品国产a级 | 欧美色综合 | 91丨九色丨国产在线 | 精品国产免费人成在线观看 | 欧美高清视频在线观看 | 亚洲一区欧美一区 | 秋霞国产 | 国产精品一区二区三区四区五区 | 国产精品二区三区 | 国产中文视频 | 久久亚洲一区二区 | 久久精品无码一区二区三区 | 亚洲天堂色| 一区二区三区免费 | 亚洲国产精品区 | 国产大学生情侣呻吟视频 | 五月天天丁香婷婷在线中 | 欧美一区二区三区在线观看 | 91国内视频在线 | 久久福利| 羞羞视频在线观看网站 | 亚洲二区在线 | 国产99久久| 国产亚洲精品久久久久动 | 亚洲一区二区视频 | 黄视频国产 | 亚洲欧美日韩精品久久亚洲区 | 男女视频在线看 | 亚洲97| 久久久久亚洲精品国产 | 久热国产精品 | 精品视频一区二区三区 |