因為目前SQL注入是非常熱門而且技術門檻較低的攻擊手段,并且非常實用,輕則可以拿到網站的一些帳號,比如拿到某個電影網站的黃金會員的帳號;重則利用其網站樓多入侵整個服務器等等。 這里打算作為一個專題講解SQL及其注入。其中對于SQL不太明白的地方希望大家自己查資料。這個帖子將長期更新。。。 一,SQL縱覽 SQL(Structured Query Language)語言是一種結構化查詢語言。SQL語言中完成核心功能的共有9個關鍵詞:SELECT(數據查詢)、CREAT、DROP、ALTER(數據定義)、INSERT、UPDATA、DELETE(數據操縱)、GRANT、REVOKE(數據控制)。 1,數據定義部分 (1)創建基本表 creat table Employee ( Eno char(6) not null unique, Ename char(20) unique Esex char(2) Eage int Edept char(10) Espe char(20) ) 該語句創建了一個名為Employee的數據表,共有六列,分別為字符型(長度為6,非空,唯一)的雇員號Eno,字符型(長度為20,唯一)的雇員號姓名Ename,字符型(長度為2)的雇員性別,整型的雇員年齡,字符型(長度為10)的雇員部門,字符型(長度為20)的雇員特長. (2)刪除基本表 DROP TABLE Employee (3)更改基本表 ALTER TABLE Employee ADD Esalary CHAR(5) 在雇員表中加入一列,字符型(長度為5)的雇員薪水. ALTER TABLE Wmployee DROP UNIQUE(Ename); 去掉雇員表中雇員姓名的唯一屬性. ALTER TABLE Employee MODIFY Esex CHAR(1); 把雇員表中的性別列改為一位字符型. 2,數據查詢部分 這是SQL語句中最靈活,功能最強的部分. (1)基本查詢語句 SELECT Eno,Ename,Esex FROM Employee 查詢Employee表中的Eno,Ename,Esex三列 SELECT * FROM Employee 查詢Employee表中的所有列. SELECT DISTINCT Eno FROM Employee; 查詢Employee表中的Eno列,并去除重復行. (2)條件(WHERE)查詢語句 插敘條件的連接詞如下:NOT,=,>,<,>=,<=,!=,<>,!>,!<,BETWEEN AND,NOT BETWEEN AND(確定范圍),LIKE,NOT LIKE(字符匹配),IS NULL,IS NOT NULL(空值),AND,OR(多條件連接). ⅰ 比較 SELECT Eno FROM Employee WHERE Eage <=25 列出表中年齡小于25的雇員號 ⅱ 確定范圍 SELECT Eno,Ename FROM Employee WHERE Eage [NOT] BETWEEN 20 AND 30 列出表中年齡(不)在20到30的雇員號和姓名 ⅲ 確定集合 SELECT Eno,Ename FROM Employee WHERE Edept [NOT] IN (‘SD',’HD’) 列出表中(不)是軟硬件開發部的雇員號和姓名 ⅳ 字符匹配 LIKE的用法如下 [NOT] LIKE ‘<匹配模式>’[ESCAPE ‘<換碼符>’] 通配符號有%和_兩種。 %:匹配任意長度的字符串(長度可以為0)。A%b可與ab,adfb等匹配。 _:匹配單個任意字符。a_b可與a#b,a@b等匹配。 如果有ESCAPE,則跟在換碼符號后的%或者_不再是通配符號,只是正常的%或_。 例如: SELECT * FROM Employee WHERE Ename LIKE ‘劉%’ 查找表中姓劉雇員的信息 SELECT * FROM Employee Where Ename LIKE ‘劉_ _’ 查找表中姓名為劉某(兩個字)的雇員的信息。 SELECT * FROM Employee WHERE Espe LIKE ‘DB%t_‘ESCAPE’’ 查找表中特長項為DB_開始,倒數第二個字符為t的雇員的信息。 Ⅴ 空值SELECT * FROM Employee WHEREE Espe IS [NOT] NULL 查找表中特長項(不)為空的雇員信息。 Ⅵ 多條件連接 SELECT Ename FROM Employee WHERE Edept ='SD' AND Eage <=30; 列出表中軟件開發部門30及30歲以下雇員姓名。 (3)結果排序 對查詢結果進行排序用ORDERBY,ASC(默認)為升序,DESC為降序 SELECT * FROM Employee ORDER BY Edept,Eage DESC (4)結果分組 對查詢結果的分組一般要用到SQL的集函數,因此先介紹集函數。 SQL語言的集函數主要有COUNT(統計總數),SUM(求和),AVG(求均值),MAX(最大值),MIN(最小值)。 SELECT MAX(Eage) FROM Employee WHERE Edept='SD' 列出軟件開發部年紀最大雇員的姓名。 SELECT Edept FROM Employee GROUP BY Edept HAVING Count(*)>10 統計各部門的雇員數,只顯示雇員數大于10的部門。 SELECT Edept,COUNT(Eno) FROM Employee GROUP BY Edept 統計各部門雇員數,按部門分組列出各部門的雇員數。 (5)連接查詢 連接查詢是查詢涉及多個數據表,FROM后連接多個表的情況。 假如我們要統計各個項目參加人的雇員號和姓名,涉及的表Eproject結構如下: Eproject (Eno CHAR(6),Pno CHAR(6),TimeBgnTIME, TimeEnd TIME,Remark CHAR(50)) 相應的查詢語句為: SELECT Eproject.Pno,Employee.Eno,Ename FROM Employee,Eproject WHERE Employee.Eno=Eproject.Eno ORDER BY Eproject.Pno; 列出參加各項目的雇員號和姓名,并按照項目號升序排列。 (6)集合查詢 集合查詢指的是多個SELECT查詢結果間進行的集合操作。主要有UNION(并操作),INTERSECT(交操作),MINUS(差操作),其中標準SQL中沒有提供交操作和差操作,但他們可以使用聯合查詢實現。 假如我們要查詢硬件開發部年齡不大于25歲的雇員,可以結合查詢實現如下: SELECT * FROM Employee WHERE Edept='HD' UNION SELECT * FROM Employee WHERE Eage<=25 3,數據更新部分 SQL中的數據更新語句有INSERT,UPDATE和DELETE三種,用法如下: (1)插入數據 INSERT INTO Employee valueS ('13253','王二','男','23','SD','DB_Project') 向雇員表中插入一條完整的數據 INSERT INTO Employee (Eno,Ename) valueS ('13253','王二'); 向表中插入一條數據,只包含雇員號和姓名,其他列為空值。 注意:以上情況,屬性為非空的列一定不能為空值。 (2)修改數據 UPDATE Employee SET Eage=24 WHERE Eno='13253' 將表中13253號雇員年齡改為24歲 (3)刪除數據 DELETE FROM Employee WHERE Eno='13253' 4,數據控制部分 (1)用戶授權 SQL用戶授權使用GRANT關鍵詞,它的用法如下: GRANT SELECT ON TABLE Employee TO usr1; 允許用戶usr1查詢表Employee GRANT ALL PRIVILEGES ON TABLE Employee TO usr2; 允許用戶usr2對表Employee的任何操作 (2)收回權限 SQL中收回用戶權限使用REVOKE關鍵詞 REVOKE UPDATE(Eno) ON TABLE Employee FROM usr3;] 收回usr3更新表Employee中Eno列的權利 REVOKE ON TABLE Employee FROM PUBLIC 不允許所有用戶在表Employee中添加數據。 |