php基础:常见函数
内建函数
文章目录 内建函数 1、文件操作函数: 2、代码执行函数: 3、反序列化函数: 4、数据库操作函数: 5、类型转换与比较函数: 6、其他常见函数:
1、文件操作函数:
include()
: 导入并执行指定的 PHP 文件。例如:include('config.php');
会导入并执行 config.php
文件中的代码。
require()
: 类似于 include()
,但如果文件不存在,则会产生致命错误。
include_once()
, require_once()
: 与 include
和 require
类似,但只导入文件一次。
fopen()
: 打开一个文件或 URL。例如:$file = fopen("test.txt", "r");
会以只读模式打开 test.txt
。
file_get_contents()
: 读取文件的全部内容到一个字符串。例如:$content = file_get_contents("test.txt");
file_put_contents()
: 将一个字符串写入文件。例如:file_put_contents("test.txt", "Hello World!");
2、代码执行函数:
system()
:执行外部程序并显示输出。可能被用于执行系统命令。
exec()
:执行一个外部程序。返回命令执行结果的最后一行。如exec("ls -la")
可列出当前目录的详细内容。
shell_exec()
:通过 shell 环境执行命令,并将完整的输出以字符串的形式返回。例如shell_exec("cat /etc/passwd")
可读取系统密码文件。
passthru()
:执行外部程序并显示原始输出。如passthru("uname -a")
可显示系统信息。
eval()
: 执行字符串中的 PHP 代码。例如:eval('$x = 5;');
会设置变量 $x
的值为 5。
3、反序列化函数:
4、数据库操作函数:
mysql_query()
:执行一条 MySQL 查询。例如mysql_query("SELECT * FROM users WHERE username = '$_GET[username]'")
。mysqli_query()
:执行一条 MySQL 查询。与mysql_query
类似,但支持 MySQLi 扩展。如mysqli_query($conn, "SELECT * FROM users")
可查询用户表。PDO::query()
:执行一条 SQL 语句。使用 PDO 预处理语句可有效防止 SQL 注入。例如$pdo->query("SELECT * FROM users")
可查询用户表。mysql_fetch_array()
:从结果集中取得一行作为关联数组或数字数组。如$row = mysql_fetch_array($result)
可获取查询结果。
5、类型转换与比较函数:
is_numeric()
:检查变量是否为数字或数字字符串。is_numeric("123")
→ true
;is_numeric("123a")
→ false
;is_numeric("1e3%26cat")
→ true
("1e3"
→ 1000,是合法数字开头,后面内容被忽略,此方法用于绕过)。
//绕过
is_numeric() 要求字符串必须以数字、正负号(+/-)或小数点开头。
结尾加空白符(%0a、%0b、%0c、%0d、%09)如果出现在字符串结尾,is_numeric() 会忽略它们并返回 true(只要前面是合法数字)。例如 "123%0a" 解码后是 "123\n",is_numeric() 会忽略 \n,只检查 "123"。科学计数法(如 "1e3")即使包含 e 或 E,is_numeric() 仍返回 true,但中间不能有空白符例如 "1e%0a3" 会返回 false(因为 e 和 3 被换行符隔开)。//说明%0a → 换行符(\n)%0b → 垂直制表符(\v)%0c → 换页符(\f)%0d → 回车符(\r)%09 → 水平制表符(\t)
//示例
$input = $_GET['num'];
if (is_numeric($input)) {system("echo " . (int)$input);
} else {die("Invalid input!");
}//payload
num=1e2&cat+/etc/passwd注入失败,&符号被URL解析为参数分隔符,导致失败,PHP解析为:$_GET['num'] = "1e3"$_GET['cat'] = "/etc/passwd"(但代码未使用该参数,不影响逻辑)num=1e2%23cat+/etc/passwd$_GET['num'] = "1e3&cat+/etc/passwd" is_numeric("1e3&cat+/etc/passwd"),开头 "1e3" 是合法数字 → 返回 true。(int)"1e3&cat+/etc/passwd"转换时遇到 & 停止,取 1(因为 e 不是数字字符)system()执行 → echo 1&cat+/etc/passwd实现代码注入
strcmp()
:比较两个字符串(区分大小写)。strcmp("a", "b")
→ -1
;strcmp("b", "a")
→ 1
;strcmp("a", "a")
→ 0
;若参数非字符串(如传入数组),返回NULL
//绕过
strcmp()要求参数必须是字符串类型。传入数组类型时(如$_GET['pass']=array()),函数返回NULL。在弱类型比较(==)时,NULL == 0 成立,导致验证绕过。//说明
此漏洞存在于PHP 5.x版本,PHP 7+会直接报Warning但仍返回NULL。防御方法:1. 使用===严格比较2. 先检查参数类型is_string()
//示例
if (strcmp($_POST['password'], $real_password) == 0) {echo "Login success!";
}//payloadPOST: password[]=1//修复代码if (is_string($_POST['password']) && strcmp($_POST['password'], $real_password) === 0) {echo "Login success!";}
intval()
:将变量转换为整数类型。在转换时会忽略非数字字符。如intval("123abc")
→ 123
;intval("abc")
→ 0
。
strval()
:把变量转换为字符串类型。如strval(123)
会返回 字符串"123"。
floatval()
:获取变量的浮点数值。转换时可能存在精度丢失问题。例如floatval("3.14abc")
会返回 3.14。
==
:松散比较。比较两个值是否相等,不比较类型。存在类型比较漏洞,可能导致不同类型的值被判定为相等。例如0 == "abc"
的结果为 true。
===
:严格比较。比较两个值是否相等且类型相同。
6、其他常见函数:
isset()
:检测变量是否已声明且非null
。isset($undefined)
→ false
;若检测数组键值,需明确指定,如isset($_GET["key"])
,常用于绕过未初始化变量的错误。assert()
:检查表达式是否为真(PHP < 8.0)。assert("1==1")
→ true
;若参数可控,可能直接执行代码(如assert("system('ls')")
)。substr()
:截取字符串的一部分。 $part = substr("HelloCTF", 5); // 返回"CTF"
trim()
:去除字符串首尾空白字符。trim(" abc ")
→ "abc"
;但无法移除中间空格file_exists()
:检查文件是否存在。file_exists("/etc/passwd")
→ true
;可用于探测敏感文件路径,但本身不读文件内容。filter_var()
:过滤变量。filter_var("a@b.com", FILTER_VALIDATE_EMAIL)
→ "a@b.com"
;但某些畸形输入可能绕过校验(如换行符注入)。phpinfo()
:输出 PHP 的配置信息。preg_replace()
: 执行正则表达式搜索和替换。例如:$newStr = preg_replace("/apple/i", "orange", $str);
会将 $str
中的 “apple” 替换为 “orange”。/i
匹配时不区分大小写preg_match()
:执行正则匹配。preg_match("/^[a-z]+$/", "abc")
→ 1
;若正则表达式可控,可能触发ReDoS或绕过过滤。die()
:输出一条消息并退出当前脚本。例如die("Database connection failed!")
会显示错误信息并终止脚本。exit()
:输出一条消息并退出当前脚本。与die()
类似。如exit("Invalid input!")
会显示错误信息并终止脚本。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/bicheng/84710.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!