日期:2012-09-02  浏览次数:20923 次

因为目前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'