SQL注入漏洞
sql注入漏洞,简称注入攻击,sql注入,被广泛用于非法获取网站控制权,是发生在应用程序的数据库层上的安全漏洞。在设计程序忽略了对输入字符串中夹带的sql指令的检查,被数据库认为是正常的sql指令而运行,从而使数据库收到攻击,可能导致数据被窃取、更改、删除,以及进一步导致网站被嵌入恶意代码,被植入后门程序等危害。
DBMS:数据库
SQL语句分类:
1.DDL:数据定义语言,用来定义数据库对象创建、删除、修改库表结构。
2.DML:数据操作语言,用来定义数据库记录。增删改表记录。
3.DCL:数据控制语言,用来定义访问权限和安全级别。
4.DQL***** 数据查询语言。及其重要,用来查询数据。
1 数据库
*查看所有数据库:SHOW DATABASES
*创建数据库:CREATE DATABASE[IF NOT EXISTS]mydb1[CHARSET=utf8]
*切换(选择要操作的)数据库:USE数据库名
*删除数据库:DROP DATABASE[IF EXISTS]mydb1
*修改数据库编码:ALTER DATABASE mydb1 CHARACTER SET utf8
2数据类型
2.数据类型(列类型)int:整型
double:浮点型,例如double(5,2)表示最多5位,其中必须有2位小数,即最大值为999.99;decimal:浮点型,在表单钱方面使用该类型,因为不会出现精度缺失问题;
char:固定长度字符串类型;char(255),数据的长度不足指定长度,补足到指定长度!”
char(255)1
varchar:可变长度字符串类型;varchar(2),zhangSan
text(clob):字符串类型;
3表控制
creat table 表名(
列名列类型,
列名列类型,
列名列类型
)
alter table 表名
modify列名 列新的类型
alter table表名
rename to 新名
修改数据
*UPDATE 表名 SET列名1=列值1,列名2=列值2.…[WHERE条件]
*条件(条件可选的):
条件必须是一个boolean类型的值或表达式:UPDATE t_person SET gender='男’age=age+1 WHERE sid='1;
运算符:=、l=、<>、>、<、>=、<=、BETWEEN.…AND、IN…)、IS NULL、NOT、OR、AND
WHEREage>=18 AND age<=80
WHERE age BETWEEN 18 AND 80
WHERE name=‘zhangSan’OR name=‘lisi’
WHERE name IN("zhangSan’,'liSi)
WHERE age IS NULL,不能使用等号
WHERE age IS NOT NULL
删除表
DELETE FROM 表名[WHERE 条件]
字符串类型只能使用单引号不能使用双引号
用户控制
1.创建用户
*CREATE USER 用户名@IP地址 IDENTIFIED BY 密码;
用户只能在指定的IP地址上登录
*CREATE USER用户名@”%’ IDENTIFIED BY 密码;
用户可以在任意IP地址上登录
2.给用户搜权
·GRANT 权限1,.…,权限n ON数据库.*TO用户名@IP地址
权限、用户、歇据库
给用户分派在指定的数据库上的指定的权限
例如:GRANT CREATE,ALTER,DROPRINSERT,UPDATE,DELETE,SELECT ON mydb1.*TO user1@localhost;
*给user1用户分派在mydb1数据库上的create,alter.drop、insert.update、delete.select权限
*GRANT ALL ON 数据库.*TO 用户名@IP地址:
给用户分派指定数据库上的所有权限
3.撤销授权
*REVOKE 权限1,…,权限n ON 数据库.*FROM 用户名@IP地址;
撤消指定用户在指定数据库上的指定权限
例如;REVOKE CREATE,ALTER,DROP ON mydb1.*FROM user1@localhost;
*撤消user1用户在mydb1数据库上的create、alter、drop权限
4.查看权限
*SHOW GRANTS FOR 用户名@IP地址 查看指定用户的权限
列运算
1数量类型的列可以做加、减、乘、除运算
SELECT sal*1.5 FROM emp;
SELECT sal+comm FROM emp;
2字符串类型可以做连续运牌
SELECT CONCAT(’$’,sal)FROM emp;
3转换NULL值
有时需要把NULL转换成其它值,例如com+1000时,如果com列存在NUL值,那么NULL+1000还是NULL,而我们这时希望把NULL当前0来运算。
SELECT IFNULL(comm,0)+1000 FROM emp:
->IFNULL(comm,0):如果comm中存在NULL值,那么当成0来运障。
4给列起别名
你也许已经注意到了,当使用列运算后,查询出的结果集中的列名称很不好看,这时我们需要给列名起个别名,这样在结果集中列名就显示别名了
SELECT IFNULL(comm,0)+1000 AS 奖金 FROM emp;一>其中AS可以省略
查询**************/*******
字符串匹配
SELECT * FROM emp WHERE ename LIKE ‘张%’;
->其中%匹配0~N个任意字符,所以上面语句查询的是姓张的所有员工。
SELECT * FROM emp WHERE ename LIKE '%阿%;
->干万不要认为上面语句是在查询姓名中间带有阿字的员工,因为%匹配0~N个字符,所以姓名以阿开头和结尾的员工也都会查询到。
SELECT * FROM emp WHERE ename LIKE ‘%’;
->这个条件等同于不存在,但如果姓名为NULL的查询不出来!
条件控制
1)条件查询
与前面介绍的UPDATE和DELETE语句一样,SELECT语句也可以使用WHERE子句来控制i
*SELECT empno,ename,sal,comm FROM emp WHERE sal >10000 AND comm
*SELECT empno,ename,sal FROM emp WHERE sal BETWEEN 20000 AND 30000
·SELECT empno,ename,job FROM emp WHERE job IN(经理,‘重事长);
2)模糊查询
当你想查询姓张,并且姓名一共两个字的员工时,这时就可以使用模糙查询
SELECT * FROM emp HERE ename LIKE '张_;
模糊查询需要使用运算符:LIKE,其中_匹配一个任意字符,注意,只匹配一个字符而
上面语句查询的是姓张,名字由两个字组成的员工,
SELECT * FROM emp WHERE ename LIKE ‘___’:/“姓名由3个字组成的员工*/
如果我们想查询姓张,名字是几个字都可以的员工时就要使用“%”了。
排序
1)升序
SELECT * FROM emp ORDER BY sal;
->按sal排序,升序,其中ASC是可以省略的
2)降序
SELECT * FROM WHERE emp ORDER BY comm DESC;
->按comm排序,降序!->其中DESC不能省略
3)使用多列作为排序条件
SELECT*FROM WHERE emp ORDER BY sal ASC,comm DESC;
使用sal升序排,如sal相同时,使用comm的降序排
纵向运算
1)COUNT SELECT(*) FROM emp;计算emp表中所有列都不为NULL的记录的行数
SELECT COUNT(comm)FROM emp;云计第emp表中comm列不为NULL的记录的行数
2)MAX SELECT MAX(sal)FROM emp;查询最高工资
3)MIN SELECT MIN(sal)FROM emp;查询最低工资
4)SUM SELECT SUM(Sal)FROM emp;查询工资合
5) AVG SELECT AVG(Sal)FROM emp:查询平均工资
SQL注入的条件
1、输入的数据是可控的
2、你输入的数据,是要被代入到数据库进行查询的