PHP常见函数和过滤函数的深入探究

V站笔记

0x00 intval()

function:

此函数主要用于将变量强转为向下取整的整型数字

example:

xxxxx -> 0
2xxxx -> 2
2.044 -> 2
0.555 -> 0
5e10  -> 5        //科学计数法

32 位系统最大带符号的 integer 范围是 -2147483648 到 2147483647。举例,在这样的系统上, intval(‘1000000000000’) 会返回 2147483647。64 位系统上,最大带符号的 integer 值是 9223372036854775807。


0x01 is_numeric()

function:

判断变量是否为数字或数字字符串,不仅检查10进制,16进制是可以。

example:

返回的是BOOL值
1111 -> true/1
sdkl -> false/NULL
44jk -> false/NULL
0x12 -> true/1        //十六进制,0x276f722731273d2731='or'1'='1 绕过SQL注入
5e10 -> true/1
%20%20%2044 -> true/1    //忽略空格
2044%20 -> false/NULL    //放在末尾为false
%002044 -> false/NULL    //%00 出现就是false

在线十六进制转换:https://www.bejson.com/convert/ox2str/

0x02 htmlspecialchars()

function:

这个函数大家都很熟悉,用于放置XSS,转义
&转成&
"转成"
'转成' //发现并不转义 当htmlspecialchars($username)
<转成<
>转成>

注意 ‘ 不转义,此函数并不能防止SQL注入


0x03 addslashes()

单双引号、反斜线及NULL加上反斜线转义

被改的字符包括单引号 '、双引号"、反斜线 backslash \ , 以及空字符 NULL/不转换


0x04 mysql_real_escape_string()

转义SQL字符串中的特殊字符

转义 \x00 \n \r 空格 \ ' " \x1a,针对多字节字符处理很有效。mysql_real_escape_string会判断字符集,mysql_escape_string则不用考虑。


0x05 parse_url()

本函数解析一个 URL 并返回一个关联数组,包含在 URL 中出现的各种组成部分。

reference: http://php.net/manual/zh/function.parse-url.php

绕过的方式用多个///// 原因:对严重不合格的 URL, parse_url() 可能会返回 FALSE 并发出 E_WARNING


0x06 sha1()

sha1() 函数计算字符串的 SHA-1 散列

reference: http://www.w3school.com.cn/php/func_string_sha1.asp

sha1()不能处理数组,当为数组的时候返回bool(false)


0x07 md5()

md5() 函数计算字符串的 MD5 散列

refernece: http://www.w3school.com.cn/php/func_string_md5.asp

md5(,true) 时返回 原始 16 字符二进制格式

md5(ffifdyop,true) 返回 'or'6�]��!r,��b 也就造成了md5注入

当传入的参数时数组的时候,和上述的sha1()一样的返回false


0x08 strpos()

strpos() 函数查找字符串在另一字符串中第一次出现的位置。

注释:strpos() 函数对大小写敏感。

这一点常在CTF中考到

stripos() - 查找字符串在另一字符串中第一次出现的位置(不区分大小写)
strripos() - 查找字符串在另一字符串中最后一次出现的位置(不区分大小写)
strrpos() - 查找字符串在另一字符串中最后一次出现的位置(区分大小写)

reference: http://www.w3school.com.cn/php/func_string_strpos.asp


0x09 ereg()

可以使用%00截断正则匹配

ereg()eregi() 不同之处

<?php
if (ereg("C","abcdef")){
     echo "通过";
}else{
     echo "错误";
}
?>
//返回结果是:错误 大小写敏感

<?php
if (eregi("C","abcdef")){
     echo "通过";
}else{
     echo "错误";
}
?>
//返回结果是:通过 大小写不敏感
?>

0x10 str_replace()

正则匹配,只替换一次是一个考点

echo str_replace("select","","SQL 注入语句: select user,pass from users #"); 
输出:SQL 注入语句: user,pass from users #

echo str_replace("select","","SQL 注入语句: selselectect user,pass from users #"); 
输出:SQL 注入语句: select user,pass from users #

reference: http://www.w3school.com.cn/php/func_string_str_replace.asp


0x11 strcmp()

比较两个字符串

int strcmp ( string $str1 , string $str2 )

参数 str1第一个字符串。str2第二个字符串。如果 str1 小于 str2 返回 < 0; 如果 str1 大于 str2 返回 > 0;如果两者相等,返回 0。

传参数为数组类型可绕过


0x99 测试时的index.php源码

<?php

//测试
$id = isset($_GET['id'])?$_GET['id']:0; 
$username = isset($_GET['username'])?$_GET['username']:NULL;
$passwd = isset($_GET['passwd'])?$_GET['passwd']:NULL;

echo "获取变量:".$id."<br/>".$username."<br/>".$passwd."<br/>";

//intval()
echo intval($id)."<br/>";

//is_numeric()
echo is_numeric($id)."<br/>";
var_dump(is_numeric($id));
echo "<br/>";

//htmlspecialchars()
var_dump(htmlspecialchars($username));
echo "<br/>";

//addslashes()
var_dump(addslashes($username));
echo "<br/>";

//mysql_real_escape_string()

var_dump(mysql_real_escape_string($passwd));
echo "<br/>";

//sha1()
if(sha1($username) === sha1($passwd)){
    echo "sha1 success!";
}
else{
    echo "sha1 error!";
}
echo "<br/>";

//md5()
echo md5($id)."<br/>";
echo md5($id,true)."<br/>";
if(md5($username) === md5($passwd)){
    echo "md5 success!";
}
else{
    echo "md5 error!";
}
echo "<br/>";

//str_replace()
echo str_replace("select","","SQL 注入语句: selselectect user,pass from users #"); 



?>

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏闵开慧

java概念1

public static void main(String[] args) {//其中[]也可以写在args后面,args也可以随便写成其他字母,例如asd...

367110
来自专栏IT派

SQL Server 与 MySQL 中排序规则与字符集相关知识的一点总结

字符集是针对不同语言的字符编码的集合,比如UTF-8字符集,GBK字符集,GB2312字符集等等,不同的字符集使用不同的规则给字符进行编码。排序规则则是在特定字...

9450
来自专栏分布式系统进阶

Librdkafka的基础数据结构 1 --- 队列

两个元素: tqh_first: 指向队列的第一个成员; tqh_last: 存的是队列里的最后一个元素的 next指针的变量地址, 这个二级指针太有用了,...

11120
来自专栏书山有路勤为径

哈希表基础知识

哈希表(Hash table,也叫散列表),是根据关键字值(key)直接进行访问的数据结构,它通过把关键字值映射到表中一个位置(数组下标)来直接访问,以加快查找...

8910
来自专栏程序员互动联盟

【编程技巧】条条大路通罗马

问题:对于一个字节(8bit)的变量,求其二进制表示中“1”的个数,要求算法的执行效率尽可能地高。 分析与解法 大多数的读者都会有这样的反应:这个题目也太简单了...

380110
来自专栏码匠的流水账

聊聊flink的CheckpointedFunction

flink-streaming-java_2.11-1.7.0-sources.jar!/org/apache/flink/streaming/api/chec...

18640
来自专栏Android机器圈

数据结构与算法----数学应用之一元多项式

PS:上一篇说了线性表的顺序表和链式表表达,该片就写一下应用到现实数学中去,一元多项式的加减。

12820
来自专栏xcywt

《Linux命令行与shell脚本编程大全》第二十二章 gawk进阶

gawk是一门功能丰富的编程语言,你可以通过它所提供的各种特性来编写好几程序处理数据。  22.1 使用变量 gawk编程语言支持两种不同类型的变量: 内建变量...

23460
来自专栏软件开发 -- 分享 互助 成长

数据库的规范化

一、基础概念 实体:现实世界中客观存在并可以被区别的事物。比如“一个学生”、“一本书”、“一门课”等。 属性:教科书上解释为:“实体所具有的某一特性”,由此可见...

18060
来自专栏Coding迪斯尼

自制Monkey编程语言编译器:增加数组操作API和Mapsh数据类型

13730

扫码关注云+社区

领取腾讯云代金券