荐 sqllibs-Less17-update
文章目录
A、背景知识–数据库的增删改
原本是增删改查的,但是查(select)在我们之前已经着重讲解了,所以在这边就不赘述了,在这里主要讲解数据库的增删改。
A.1、增-insert
参考链接:https://blog.csdn.net/qq_40194399/article/details/94554191
-
1.Inset into 表名 values(值1,值2)
-
2.Inset into 表名(字段1,字段2) values(值1,值2)
-
3.REPLACE INSERT语句
此语句的作用是当我们在插入一条数据时,如果此条已经存在,那么先删除原来存在的数据再添加插入的数据,如果不存在那么直接插入新的数据。注意:却分是否存在是通过主键来确定的 -
4.INSERT IGNORE INTO 语句
此语句的作用是如果插入的数据已经存在那么就忽略插入的数据(也就是不改变原来的数据),如果不存在则插入新的数据。
注意:却分是否存在是通过主键来确定的 -
5.Inset into 表名(字段1,字段2,字段3) values(值1,值2,值3);Inset into 表名(字段1,字段2,字段3) values(值1,值2,值3)
-
6.INSERT SELECT语句
-
- 此语句的作用是将SELECT语句的结果插入表中,可实现数据迁移
-
- 语法:insert into 插入的表名(字段1,字段2,字段3) select 被查询的字段1,被查询的字段2 from 被查询的表名;
-
- 先查看需要插入的表的所有数据
A.2、删-delete,drop
- 1.DELETE 语句用于删除表中的行。
语法:DELETE FROM 表名称 WHERE 列名称 = 值 - 2.删除某行
举例:“Fred Wilson” 会被删除:
DELETE FROM Person WHERE LastName = ‘Wilson’ - 3.删除所有行
可以在不删除表的情况下删除所有的行。这意味着表的结构、属性和索引都是完整的:
DELETE FROM table_name
或者:DELETE * FROM table_name - 4.删除数据库:drop database 数据库名
- 5.删除表:drop table 表名
- .6. 删除表中的列:alter table 表名 drop column 列名;
A.3、改-update
UPDATE 表名称 SET 列名称 = 新值 【 WHERE 列名称 = 某值】
举例:
/*修改某一行中的某一列*/
UPDATE Person SET FirstName = 'Fred' WHERE LastName = 'Wilson'
/*修改指定行中的若干列*/
UPDATE Person SET Address = 'Zhongshan 23', City = 'Nanjing'
WHERE LastName = 'Wilson'
17.Less17-Update Query-Error based
17.1、报错尝试
从页面给出的提示可以看出来的这关主要是针对重置密码的,那么我们便可以猜测这一关所利用的语句是update更新操作,实际上也是如此,本关中用到的操作的确是update修改操作。
当我们输入以下语句时,
admin’ 【单引号,无显示】
admin’# 【单引号+注释,无显示】
admin 和 1 【username和password均输入,正常】
admin 和 1’ 【password输入1+单引号,报错显示,错误如下】
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘admin’’ at line 1
admin 和 1’ # 【password输入1+单引号+注释,正常】
从上面可以看出,这一关password将会显示数据库报错信息,因此可以从password着手开始。
可以对password用报错注入。如下
报错出数据库版本号:
password:1' and extractvalue(1,conccat(0x7e,(select version()),0x7e))#
17.2、代码分析
如下,我们可以看见,对于传递到后台的参数中,uname是进行了过滤的,而passwd并没有进行过滤,这就是我们报错尝试时,username无法注入的原因吧!
那么接下来,我们来看一下这个check_input函数是怎么对uname进行过滤的吧!
function check_input($value)
{
if(!empty($value))
{
// truncation (see comments)
//如果字符串过长,将产生截断,仅仅报错15个字符
$value = substr($value,0,15);
}
// Stripslashes if magic quotes enabled
//如果使用了魔术引号?,则Stripslashes删除由 addslashes() 函数添加的反斜杠
if (get_magic_quotes_gpc())
{
$value = stripslashes($value);
}
/* Quote if not a number
ctype_digit和is_numeric判断是不是数字
if(!is_numeric($value))*/
if (!ctype_digit($value))
{
/*过滤字符串,编码的字符是 NUL(ASCII 0)、\n、\r、\、'、" 和 Control-Z。
mysql_real_escape_string()转义 SQL 语句中使用的字符串中的特殊字符。*/
$value = "'" . mysql_real_escape_string($value) . "'";
}
else
{
/*intval() 进制转换,转换为整型*/
$value = intval($value);
}
return $value;
}
17.2.1、substr()
语法:substr(string,start,length)
分析:从start开始截取string字符串长度为length的字符串。
第一个字符串的位置为0
17.2.2、addslashes()
addslashes() 函数返回在预定义字符之前添加反斜杠的字符串。
预定义字符是:
- 单引号(’)
- 双引号(")
- 反斜杠(\)
- NULL
提示:该函数可用于为存储在数据库中的字符串以及数据库查询语句准备字符串。
注释: : 默认地,PHP 对所有的 GET、POST 和 COOKIE 数据自动运行 addslashes()。 所以您不应对已转义过的字符串使用 addslashes(),因为这样会导致双层转义。遇到这种情况时可以使用函数 get_magic_quotes_gpc() 进行检测。
语法:addslashes(string)
参数 | 描述 |
---|---|
string | 必需。规定要转义的字符串。 |
返回值: | 返回已转义的字符串。 |
PHP 版本: | 4+ |
17.2.3、get_magic_quotes_gpc()和stripslashes()
参考链接:https://www.cnblogs.com/lemon66/p/4224892.html
在magic_quotes_gpc=On的情况下,如果输入的数据有
单引号(’)、双引号(”)、反斜线()与 NUL(NULL 字符)等字符都会被加上反斜线。这些转义是必须的,如果这个选项为off,那么我们就必须调用addslashes这个函数来为字符串增加转义。
正是因为这个选项必须为On,但是又让用户进行配置的矛盾,在PHP6中删除了这个选项,一切的编程都需要在magic_quotes_gpc=Off下进行了。在这样的环境下如果不对用户的数据进行转义,后果不仅仅是程序错误而已了。同样的会引起数据库被注入攻击的危险。所以从现在开始大家都不要再依赖这个设置为On了,以免有一天你的服务器需要更新到PHP6而导致你的程序不能正常工作。
magic_quotes_gpc() | get_magic_quotes_gpc() |
---|---|
ON | 返回1 |
OFF | 返回0 |
因此可以看出这个get_magic_quotes_gpc()函数的作用就是得到环境变量magic_quotes_gpc的值。既然在PHP6中删除了magic_quotes_gpc这个选项,那么在PHP6中这个函数我想也已经不复存在了。
php 判断是否开启get_magic_quotes_gpc功能了,以方便我们是否决定使用addslashes这个函数了。
stripslashes() 函数:删除由 addslashes() 函数添加的反斜杠。
17.2.4、mysql_real_escape_string()函数
mysql_real_escape_string() 函数转义 SQL 语句中使用的字符串中的特殊字符。
下列字符受影响:
- \x00
- \n
- \r
- \
- ’
- "
- \x1a
如果成功,则该函数返回被转义的字符串。如果失败,则返回 false。
语法:mysql_real_escape_string(string,connection)
参数 | 描述 |
---|---|
string | 必需。规定要转义的字符串。 |
connection | 可选。规定 MySQL 连接。如果未规定,则使用上一个连接。 |
说明:本函数将 string 中的特殊字符转义,并考虑到连接的当前字符集,因此可以安全用于 mysql_query()。
$row1 = $row['username'];
//echo 'Your Login name:'. $row1;
$update="UPDATE users SET password = '$passwd' WHERE username='$row1'";
mysql_query($update);
本文地址:https://blog.csdn.net/weixin_43901038/article/details/107309560