前言
收集了几个在文件上传利用中常见的函数。
 对这些函数的深入理解应该有助于文件上传利用的顺利进行。
索引
1. deldot
2. in_array
3. intval
4. strrchr
5. strtolower
6. strrpos
7. str_ireplace
8. strstr
9. substr
10. trim
常见函数
1. deldot
deldot函数为upload-lab中一个常见的函数,它实际为一个自定义函数,定义于common.php中,函数定义如下:
function deldot($s){
	for($i = strlen($s)-1;$i>0;$i--){
		$c = substr($s,$i,1);
		if($i == strlen($s)-1 and $c != '.'){
			return $s;
		}
		if($c != '.'){
			return substr($s,0,$i+1);
		}
	}
}
即从字符串的尾部开始,从后向前删除点.,直到该字符串的末尾字符不是.为止。
 因此对于如下输入,
echo deldot("hello world")."\n";
echo deldot("hello world.")."\n";
echo deldot("hello world....")."\n";
echo deldot("hello.world.")."\n";
输出为
2. in_array
in_array(mixed $needle, array $haystack, bool $strict = false): bool
其中第一个参数$needle为待搜索的值,$haystack为被搜索的数组,第三个参数决定是否进行类型比较。
第三个类型默认为false,即不考虑类型是否相同。
 对于如下输入:
if(in_array("AAA",$arr,false)) echo 1;
if(in_array("aaa",$arr,false)) echo 2;
if(in_array("AAA",$arr,true)) echo 3;
if(in_array("aaa",$arr,true)) echo 4;
输出
3. intval
intval(mixed $value, int $base = 10): int
intval 函数用于获取变量的整数值。
第一个参数$value为要获取整数值的变量,可以为字符串、数值和数组。
 第二个参数$base指定了转换所使用的进制,当且仅当要转换的变量为字符串时有效。
当第二个参数为0时,会检测变量的格式来决定使用的转换进制。
- 当存在前置的0x或0X时,使用16进制。
- 当存在前置的0时,使用8进制。
- 否则使用10进制。
intval函数返回的数值为一个int类型的数值。当转换不成功时,返回0。
特别要注意,使用该函数返回的值有上限。当转换的数值大于php的整数范围时,返回的结果为整型数值的取值上限。
echo intval("111");
echo "\n";
echo intval("111a");
echo "\n";
echo intval("0x333");
echo "\n";
echo intval("888",8);
echo "\n";
echo intval("122",3);
echo "\n";
echo intval("11111111111111111111111111111111111");
echo "\n";
echo intval("2222222222222222222222222222222");
输出为
4. strrchr
strrchr(string $haystack, mixed $needle): string
strrchr函数在字符串$haystack中查找$needle,并将最后一次查找到的$needle及其后面的字符串返回。如果没有在该字符串中查找到$needle,则返回false。
注:
- 如果第二个参数不是不是单个字符,则只使用该字符串的第一个字符进行查找匹配。
- 如果第二个参数是一个数值,则将该数值转换为对应的ASCII码进行匹配。
$S = "hhhahahaha2333";
echo strrchr($S,'h')."\n";
echo strrchr($S,'hwweraer')."\n";
echo strrchr($S,104)."\n";
if(strrchr($S,'k') == false) echo "false";
5. strtolower
strtolower(string $string): string
将字符串$string中的各个英文字符转换为小写并返回。
$S = "HaHaHaHa,Hello!!";
echo strtolower($S);
6. strrpos
strrpos(string $haystack, string $needle, int $offset = 0): int
返回字符$needle最后一次出现的位置。
 在php4中,$needle只能为单个字符。如果$needle中存在多个字符,仅使用第一个字符做匹配。
 和strrchr相似,如果$needle是一个数值,则使用该数值对应的ASCII码字符进行匹配。
 从php5开始,$needle可以为多个字符。
 从php5开始,strrpos新增一个参数$offset,可以指定从$haystack的哪儿位置开始进行匹配。
返回匹配的下标位置,没有匹配到时返回false。
注意:
- 因为返回值可能为零,所以在判断返回值是否为false的时候必须使用全等于符号===。
- 该函数区分大小写。与该函数相似的函数有: 
  - stripos:查找首个出现的位置,不区分大小写。
- strpos:查找首个出现的位置,区分大小写。
- strripos:查找最后一个出现的位置,不区分大小写。
- 即出现“i”则为不区分大小写,出现"rr"则为查找最后一个。
 
$s = "Phpphphpphpp";
echo strrpos($s,"php");
echo strrpos($s,"h");
echo strrpos($s,"P");
if(strrpos($s,"PHP") === false) echo "No exist";
输出:
注:测试使用的PHP版本为5.3.3。
 在PHP4中结果可能不一样。
7. str_ireplace
str_ireplace(
    mixed $search,
    mixed $replace,
    mixed $subject,
    int &$count = ?
): mixed
str_ireplace函数用于对数组中的元素或字符串中的子串进行替换。
第一个参数$search为需要替换的内容(子串或数组),第二个参数$replace为替换成的内容(字符串或数组),第三个参数$subject为被替换的字符串。
- 如果$search和$replace都为字符串,那么将会把$subject中匹配的子串$search替换为$replace。
- 如果$search和$replace都为数组时,将会进行映射替换。如果$replace的值的个数少于 search 的个数,多余的替换将使用空字符串来进行。
- 如果$search为数组而$replace为字符串,则对于$subject中出现的每一个search的元素,都会使用$replace做替换。
$count可以用于限定替换次数。
注:
- 替换从左到右进行。
- 该函数替换不区分字母大小写。(另外一个函数str_replace区分大小写)
<?php
echo str_ireplace("php","","hello.php")."\n";
echo str_ireplace("pHP","","hello.Php")."\n";
echo str_ireplace("php","","hello.phPHpp")."\n";
echo str_ireplace("php","p","hello.phphp")."\n";
echo str_ireplace("php",""."phpphpphpphpphp.php",3)."\n";
echo str_ireplace(array("php","html"),"","hello.php.html")."\n";
echo str_ireplace(array("php","html"),array("1","2"),"hello.php.html")."\n";
echo str_ireplace(array("php","html","css"),array("1","2"),"hello.php.css.html")."\n";
echo str_ireplace(array("php","html","css"),"1","hello.php.css.html")."\n";
foreach (str_ireplace(array("php","html","css"),array("1","2","3"),array("hello.html","hello.css","hello.html")) as $it){
	echo "$it ";
}
?>
8. strstr
strstr(string $haystack, mixed $needle, bool $before_needle = false): string
查找字符串$needle在$haystack中首次出现的位置,并将$needle及其之后的字符串返回。
PHP5起新增第三个参数$before_needle,如果$before_needle取值为true,则返回$needle前面的部分。
$s = "123phpphp.php";
echo strstr($s,"php")."\n";
echo strstr($s,"php",true)."\n";
9. substr
substr(string $string, int $offset, ?int $length = null): string
返回字符串$string中的子串。
$offset指定子串首个字符在$string中的下标位置,$length指定截取的子串长度。
$length的取值:
- $length为默认取值时,函数会将- $offset至- $length的字符串截取并返回。
- $length取正数时,会从- $offset开始将最多- $length个字符截取返回出来。
- $length取0时,返回一个空字符串。
- $length取负数时,会将- $offset至字符串- $string倒数第- $length前的字符返回出来。
$s = "123456789";
echo substr($s,1,3)."\n";
echo substr($s,1,-1)."\n";
echo substr($s,1)."\n";
echo substr($s,1,0)."\n";
10. trim
trim(string $str, string $character_mask = " \t\n\r\0\x0B"): string
去除字符串$str的首尾的空白字符。
 当第二个参数保持默认时,去除的字符为:
- " " 空格
- “\t” 制表符
- “\n” 换行符
- “\r” 回车符
- “\0” 空字节符
- “\x0B” 垂直制表符
$s = "\n   1   23456789\t\n123456789\r";
echo trim($s);
参考资料
PHP官方
注意:本文只做技术分享,请勿用于非法用途,否则后果作者概不负责。
原创不易,感谢支持。










