PHP函数及漏洞防御

PHP函数

1.回调函数

回调函数定义 :把一个函数名 / 匿名函数 / 可调用对象作为参数,传给另一个函数,由后者在内部去调用它。

可以理解为:把函数 A 当参数丢给函数 B,B 内部执行 A,A 就是回调函数。

call_user_func ()(回调函数名, 参数1, 参数2...);

php 复制代码
call_user_func("system", "whoami");
等价于 system("whoami");
从而
Linux:输出当前运行 PHP 进程的用户名(www-data、apache、nginx 等)
Windows:输出当前 Web 服务账户名

自定义函数的用法,例如:
function test($a){
    echo $a;
}
call_user_func("test", "hello");
等价于test("hello");
执行过程:
1.call_user_func 识别第一个参数test是自定义函数名;
2.将第二个参数hello传入test的形参 $a;
3.进入 test 函数内部执行 echo $a。

**eval()**把一段字符串文本,交给 PHP 引擎当成真实 PHP 代码去解析、运行。

php 复制代码
$str = 'echo "我是eval代码";';
eval($str);
等价于echo "我是eval代码";

array_map() 作用:对数组每一个元素调用回调函数

php 复制代码
array_map("system",["id","pwd"]);
依次执行 system("id"); system("pwd");

2.字符串处理函数

**strtolower($str)**把英文字母全部转为小写

php 复制代码
echo strtolower("ABC123");
输出:abc123

**strtoupper($str)**英文字母全部转为大写

php 复制代码
echo strtoupper("abc123");
输出:ABC123

**str_replace (查找内容,替换内容,字符串)**搜索字符串,匹配到内容直接替换(区分大小写)

php 复制代码
echo str_replace("1","2","this is 1");
输出:this is 2

**str_ireplace (查找,替换,字符串)**忽略大小写的字符串替换

php 复制代码
echo str_ireplace("CAT","dog","this is Cat");
输出:this is dog

preg_replace() 正则匹配替换

php 复制代码
echo preg_replace('/a/','b','aaa');
输出:bbb

3.高危漏洞触发函数

**assert()**作用:将字符串当做 PHP 代码执行

php 复制代码
assert("phpinfo();");
等价于 phpinfo();

**shell_exec()**执行系统 shell 命令,返回命令全部输出;无输出返回 null;等同于反引号

php 复制代码
echo shell_exec("whoami");
执行系统 shell 命令,返回完整输出;等同于反引号`cmd`

exec() 执行系统命令,仅返回命令最后一行输出;完整输出存入第二个参数

php 复制代码
exec("whoami",$res);
print_r($res);
输出:Array ( [0] => www-data )

**passthru()**执行系统命令,直接原始输出数据流(二进制数据,如图片)

php 复制代码
passthru("whoami");
输出:www-data

**include()**引入并执行指定 PHP 文件,文件不存在仅警告,脚本继续运行

php 复制代码
include("php://filter/read=convert.base64-encode/resource=index.php");
输出:index.php源码 base64 编码字符串

**include_once()**同 include,保证同一个文件只引入一次

php 复制代码
include_once("test.php");
输出:执行 test.php 内所有代码,多次执行不会重复引入

**require()**作用:引入执行文件,文件不存在直接致命错误,终止程序

php 复制代码
require("test.php");
输出:执行test.php代码;文件不存在直接报错Fatal Error

**require_once()**作用:同 require,同一个文件仅加载一次

php 复制代码
require_once("test.php");
输出:执行test.php代码,重复调用不会二次加载

extract() 将数组键名转为变量、键值赋值给变量

parse_str() 解析类似a=1&b=2字符串,自动生成变量,同样会触发变量覆盖

php 复制代码
parse_str("flag=yes",$arr);
echo $arr['flag'];
输出yes

4.文件操作函数

**file_get_contents()**读取一个文件全部内容,返回字符串

php 复制代码
echo file_get_contents("flag.txt");
输出:flag{xxxxxxxx}(文件内文本内容)

**file_put_contents()**向文件写入字符串,文件不存在自动创建

php 复制代码
file_put_contents("shell.php","<?php eval(\$_POST[cmd]);?>");
echo "写入成功";
输出:写入成功,当前目录生成 shell.php
也就是一句话木马

**unlink()**删除指定文件

php 复制代码
unlink("test.txt");
echo "删除完成";
输出:删除完成;文件不存在不会报错

**rename()**文件重命名 / 移动文件

php 复制代码
rename("tmp.jpg","shell.php");
echo "改名成功";
输出:改名成功,tmp.jpg 变成 shell.php

5. 数据解析函数

**parse_url()**作用:解析 URL,拆分协议、域名、路径、参数

php 复制代码
$url = parse_url("http://test.com/index.php?id=1");
print_r($url);
输出:Array
(
    [scheme] => http
    [host] => test.com
    [path] => /index.php
    [query] => id=1
)

**json_encode()**作用:将 PHP 数组 / 对象,转换成 JSON 格式字符串

php 复制代码
$arr = ["name"=>"test"];
echo json_encode($arr);
输出:{"name":"test"}

6.安全防御类函数

htmlspecialchars(str, flags, $charset) 转义 & < > " ' 等 HTML 特殊字符**,**防御存储型 / 反射型 XSS

**setcookie()**作用:向客户端浏览器设置 Cookie

XSS分类

存储型XSS(持久型 XSS)

攻击者将恶意 JS 代码提交保存至服务器数据库,当其他用户访问加载该数据的页面时,恶意代码会自动从数据库取出并渲染执行,具备永久性,无需构造特殊链接诱导,影响范围广、危害程度最高,常见于评论区、留言板、个人简介等交互功能。

反射型 XSS(非持久型 XSS)

恶意脚本放置在 URL 请求参数内,数据不会存入后端服务器,服务器仅简单获取参数并直接返回渲染页面,必须诱使受害者点击带有攻击载荷的特制链接才能够触发漏洞,多用于钓鱼攻击,常见于搜索、跳转页面。

DOM 型 XSS

漏洞产生于浏览器前端,恶意载荷存在于 URL 中,JavaScript 直接读取 URL 参数操作 DOM 节点渲染页面,整个攻击流程不经过服务器处理,后端无法拦截,抓包请求中看不到恶意代码,只能依靠前端代码对输出数据做过滤转义。

Web 常见 防御方案

1. 代码执行漏洞(eval /assert/preg_replace / 回调函数 RCE)

**漏洞成因:**可控字符串直接传入代码执行函数,被当作 PHP 代码运行

**防御方式:**尽量规避 eval、assert 等高危函数,通过配置禁用危险函数,禁止外部输入作为回调名称,及时更新 PHP 版本,外部输入优先采用白名单校验。

2. 命令注入漏洞(system /shell_exec/exec /passthru)

漏洞成因: 外部输入直接拼接系统 Shell 命令,可使用 | & ; || 等分隔符逃逸执行额外命令

**防御方式:**采用白名单限制用户输入,不直接将外部数据拼接系统命令,必要时使用专用函数转义参数,禁用命令执行相关函数,网站进程使用低权限账号运行。

3. 文件包含漏洞 LFI/RFI(include /include_once/require /require_once)

**漏洞成因:**文件名参数可控,攻击者利用路径穿越、伪协议读取源码、执行恶意文件

**防御方式:**使用文件名白名单,禁止直接使用用户输入作为文件路径,关闭远程文件包含,配置目录访问限制,过滤路径穿越字符防止跨目录访问。

4. 文件上传漏洞(配合 rename、file_put_contents )

漏洞成因 **:**后缀名、文件内容校验不严格,允许上传 PHP 木马文件,可被服务器解析执行

**防御方式:**后端实现文件后缀白名单校验,增加文件头部检测,图片文件可二次渲染清除木马,关闭上传目录脚本解析权限,上传文件进行随机重命名。

5. 变量覆盖漏洞(extract () /parse_str ())

漏洞成因 **:**外部可控输入可以覆盖程序内部已有变量,篡改业务逻辑(修改 flag、权限)

**防御方式:**不对原始请求数据直接使用 extract、parse_str,必须使用时开启禁止覆盖原有变量模式,手动接收指定参数,不批量导入全部外部请求数据。

6. XSS 跨站脚本(htmlspecialchars 防御,json_encode 风险)

漏洞成因 **:**可控数据输出到 HTML 页面,浏览器解析执行 JS 代码;窃取 Cookie、钓鱼

**防御方式:**数据输出到页面时进行完整 HTML 转义,Cookie 添加 HttpOnly 标识,配置 CSP 策略,避免未经处理的数据直接嵌入 JS 代码。

7. Cookie 安全漏洞(setcookie)

**漏洞成因:**Cookie 缺少安全标识、内容可控引发注入、XSS 窃取 Cookie

**防御方式:**设置 Cookie 时添加 HttpOnly、Secure 等安全标识,敏感信息不存放在 Cookie 内,禁止未经净化的用户数据直接写入 Cookie。

8. URL 解析绕过漏洞(parse_url)

**漏洞成因:**parse_url 存在解析缺陷,特殊 URL 格式可以绕过后端域名检测

**防御方式:**不单独依靠 parse_url 鉴权,增加多层校验逻辑,先标准化 URL 再校验,优先使用成熟组件验证 URL 合法性。

9. 文件操作类风险(file_get_contents /unlink/rename)

**漏洞成因:**文件路径可控,造成任意文件读取、任意删除、移动文件

**防御方式:**严格校验外部传入文件路径,过滤路径穿越字符,通过配置限制 PHP 访问目录范围,网站运行账号遵循最小权限原则。

10. 字符串过滤绕过风险(str_replace /str_ireplace/strtolower)

**漏洞成因:**仅依靠简单字符串替换黑名单过滤,存在双写绕过、大小写绕过、编码绕过

**防御方式:**优先使用白名单做输入限制,若使用黑名单则采用多重递归过滤,组合多种检测规则,不依赖单一字符串函数完成安全过滤。

相关推荐
我星期八休息2 小时前
扩展— TCP 全连接队列与 tcpdump 抓包
linux·服务器·开发语言·前端·网络·tcp/ip·tcpdump
小小代码狗2 小时前
PHP 常用函数与变量参考文档
开发语言·安全·php
看昭奚恤哭2 小时前
LWIP TCP滑动窗口为TCP ZeroWindow的解决方法
网络·tcp/ip·php
编程阿峰3 小时前
Python 环境配置(二)安装jupyter、matplotlib、numpy库
开发语言·python·jupyter·numpy·matplotlib
AC赳赳老秦3 小时前
CSDN 技术社区数据采集:OpenClaw 抓取公开技术热帖,生成领域技术热点周报
java·大数据·前端·数据库·python·php·openclaw
磁爆步兵3 小时前
内存分区:程序运行的核心秘密
java·开发语言·jvm
2501_915909063 小时前
iOS 应用反调试技详解术 检测调试器的原理与防护实践
android·ios·小程序·https·uni-app·iphone·webview
此生决int3 小时前
深入理解C++系列(06)——模版初阶与STL
开发语言·c++
烟漠河洛3 小时前
俄罗斯电商3200亿卢布疯长:跨境支付与多平台订单系统架构解析
mysql·php
Lvan的前端笔记3 小时前
AndroidX 完全入门指南
android·androidx