web安全代码基础-PHP(防护过滤操作)

web安全代码基础-PHP(防护过滤操作)
目录php.ini 全局安全配置服务器层面第一道防线safe_mode 安全模式废弃仅历史了解open_basedir 目录访问限制防目录遍历 / 跨目录文件读取disable_functions 禁用危险函数最实用安全配置magic_quotes_gpc 魔术引号已废弃仅理解原理allow_url_fopen /allow_url_include 远程文件包含防御allow_url_fopenallow_url_includemax_connections 数据库最大连接数Session 安全配置防 XSS 窃取 Cookie、中间人劫持session.cookie_httponly Onsession.cookie_secure On代码层内置函数数据检测、漏洞过滤业务代码第二层防御变量类型检测函数强制校验输入数据弱化漏洞风险filter_var 过滤器PHP 官方标准化过滤工具SQL 注入防御函数 预编译数据库漏洞核心防御转义类函数传统字符串转义治标不治本最优方案PDO/Mysqli 预编译参数化查询XSS 跨站脚本防御函数命令执行漏洞过滤函数全局流量防护WAF / 流量检测第三层前置防护三层请求处理架构对比架构 1无防护裸服务器架构 2规则型 WAF 防护主流商用 / 开源 WAF架构 3AI 大模型智能流量检测进阶方案WAF 黑白名单 关键检测内容黑名单拦截白名单放行演示链路Python Flask 模拟 WAF PHP Curl 模拟客户端防护分层总结由外到内完整安全体系php.ini 全局安全配置服务器层面第一道防线php.ini 是 PHP 运行全局配置文件所有 PHP 脚本共享生效属于底层强制安全限制无需改业务代码。safe_mode 安全模式废弃仅历史了解1、作用早期 PHP 内置安全隔离机制开启后会限制文件跨目录访问、禁止执行系统命令、限制外部文件读取。2、现状PHP5.3 起废弃PHP5.6 彻底移除不再使用替代方案open_basedirdisable_functions。open_basedir 目录访问限制防目录遍历 / 跨目录文件读取核心防护限定 PHP 脚本只能操作指定目录内的文件超出目录无法读写、包含、读取文件。1、攻击场景无限制时攻击者通过file_get_contents(/etc/passwd)、../路径穿越读取服务器敏感配置、源码、密钥。2、配置示例open_basedir /home/wwwroot:/tmp仅允许脚本操作网站根目录和临时目录/etc/、/root等系统目录直接拦截。3、优势全局生效所有文件操作函数include/file_get_contents/fopen全部受限制。disable_functions 禁用危险函数最实用安全配置替代废弃 safe_mode直接禁用高危 PHP 内置函数从根源杜绝漏洞利用。系统命令执行exec、system、shell_exec、passthru、popen文件高危操作file_put_contents、chmod、rmdir、unlink按需代码执行eval、assert、create_function一句话木马核心远程读取file_get_contents搭配 allow_url_fopen 使用配置示例disable_functions eval,assert,exec,system,shell_exec,passthrumagic_quotes_gpc 魔术引号已废弃仅理解原理功能自动对 GET/POST/COOKIE 传入的用户输入单引号、双引号、反斜杠\、NULL 自动加反斜杠转义初衷简易防 SQL 注入。缺陷PHP5.4 后彻底移除新版本不存在该配置仅转义 4 个字符无法防御宽字节注入、二阶注入会造成数据双重转义页面展示多出反斜杠。替代方案手动过滤函数 MySQL 预编译PDO 预处理。allow_url_fopen /allow_url_include 远程文件包含防御allow_url_fopen控制file_get_contents()、fopen()能否读取远程 HTTP/HTTPS 文件。关闭后file_get_contents(http://xxx.com/木马.txt)直接报错防止远程读取恶意文件。allow_url_include控制include/require能否引入远程 URL 文件高危开关必须关闭。漏洞场景远程文件包含漏洞 (RFI)?php include($_GET[page]); ?攻击者传入?pagehttp://恶意网站/木马.txt服务器会下载远程木马并执行。安全配置两个参数统一关闭allow_url_fopen Off allow_url_include Offmax_connections 数据库最大连接数限制 MySQL 同时连接数量防御数据库 CC 爆破、大量并发拖垮数据库。 配置过小会导致正常业务报错根据服务器性能调整。Session 安全配置防 XSS 窃取 Cookie、中间人劫持session.cookie_httponly OnCookie 禁止 JS 脚本读取防御 XSS 跨站攻击攻击者无法通过document.cookie盗取用户会话 Cookie就算页面存在 XSS也拿不到登录凭证。session.cookie_secure On仅 HTTPS 加密请求才会携带 CookieHTTP 明文请求不会发送 Cookie防御中间人抓包劫持会话MITM 中间人攻击。代码层内置函数数据检测、漏洞过滤业务代码第二层防御分为三类变量类型检测函数、SQL 注入专用过滤、XSS 跨站过滤、系统命令执行过滤。变量类型检测函数强制校验输入数据弱化漏洞风险核心思路用户可控输入优先判断数据类型不满足类型直接拦截从源头过滤非法输入。函数作用安全使用场景gettype($var)返回变量原始类型字符串string/int/array 等通用类型判断is_int()判断是否纯整数数字字符串不算ID、页码、金额等纯数字参数校验is_numeric()判断是否数字 / 数字字符串123 返回 true兼容前端传入数字字符串场景is_string()判断变量是否字符串文本输入校验is_array()判断是否数组批量提交参数校验is_bool()/is_float()/is_null()判断布尔、浮点、空值开关、小数参数校验is_scalar()判断是否标量字符串 / 数字 / 布尔排除数组对象过滤数组注入、对象异常输入is_object/is_resource判断对象 / 资源句柄过滤异常非法数据filter_var 过滤器PHP 官方标准化过滤工具内置多种过滤规则统一处理邮箱、URL、数字、HTML 特殊字符比手写替换更规范。1、FILTER_SANITIZE_STRING过滤 HTML 标签、特殊符号简易防XSS2、FILTER_SANITIZE_NUMBER_INT只保留数字剔除所有非数字字符防数字类参数注入3、FILTER_SANITIZE_URL清除 URL 非法特殊字符防御 URL 畸形注入4、FILTER_VALIDATE_EMAIL严格校验邮箱格式拦截非法邮箱提交示例// 校验邮箱 $email filter_var($_GET[email], FILTER_VALIDATE_EMAIL); // 清理输入去除HTML标签 $content filter_var($_POST[text], FILTER_SANITIZE_STRING);SQL 注入防御函数 预编译数据库漏洞核心防御SQL 注入原理用户输入拼接 SQL 语句篡改查询逻辑查询、删除、脱库数据。转义类函数传统字符串转义治标不治本1、addslashes($str)自动转义 \ NULL4 种字符和废弃魔术引号逻辑完全一致。缺陷无法防御宽字节注入、堆叠注入仅临时过滤。2、stripslashes($str)反转义去掉 addslashes 添加的反斜杠用于页面展示数据。3、addcslashes($str, $charlist)自定义指定字符转义灵活性更高可批量转义特殊符号。4、stripcslashes()解析反转义字符串支持\n、十六进制转义字符还原。5、mysql_real_escape_string()/mysql_escape_string () MySQL 原生转义函数转义\x00 \n \r \ \x1a等数据库敏感字符区别mysql_real_escape_string会读取当前连接字符集防宽字节废弃 mysql 扩展现代项目禁用。最优方案PDO/Mysqli 预编译参数化查询转义函数存在大量绕过漏洞预编译是根治 SQL 注入的标准方案。原理SQL 模板和用户输入完全分离数据库先编译 SQL 结构再传入参数输入永远不会被解析为 SQL 语法。示例$stmt $pdo-prepare(SELECT * FROM user WHERE id ?); $stmt-execute([$_GET[id]]);无论用户传入什么恶意字符只会被当作普通字符串处理无法篡改 SQL 逻辑。XSS 跨站脚本防御函数XSS 原理攻击者提交script恶意JS/script页面原样输出JS 在访客浏览器执行盗取 Cookie、钓鱼。1、strip_tags($str)直接剥离所有 HTML、XML、PHP 标签只保留纯文本适合纯文本展示场景评论、简介。2、htmlspecialchars($str)将 HTML 特殊字符转为 HTML 实体浏览器会原样显示标签不会执行 JS→lt;→gt;→quot;→#039;→amp;业务首选支持保留部分标签富文本场景必备。命令执行漏洞过滤函数漏洞场景PHP 调用系统命令时拼接用户输入攻击者注入分号、管道符执行多条系统命令。1、escapeshellcmd()转义整条命令中的特殊分隔符; | \等禁止拆分多条命令仅保护命令主体参数可控时仍有风险。2、escapeshellarg()将用户输入完整包裹为单个独立参数用户无法新增、拼接第二个参数防御效果更强推荐优先使用。示例对比// 危险写法 system(ping .$_GET[ip]); // 安全写法 $ip escapeshellarg($_GET[ip]); system(ping .$ip);全局流量防护WAF / 流量检测第三层前置防护php.ini 和代码防护仅在 PHP 程序内部生效流量检测是请求到达服务器之前的前置拦截分为规则检测、AI 智能检测。三层请求处理架构对比架构 1无防护裸服务器客户端请求 → Web 中间件 (Nginx/Apache) → PHP 代码处理 缺陷所有恶意请求直接进入 PHP依赖代码过滤一旦代码疏漏直接被攻击。架构 2规则型 WAF 防护主流商用 / 开源 WAF客户端请求 → WAF 流量监控规则匹配正常流量放行 → 中间件 → PHP 业务代码异常恶意流量直接拦截断开请求架构 3AI 大模型智能流量检测进阶方案基于机器学习 / 大模型训练流量样本不再只靠固定规则采集海量恶意流量SQL 注入、XSS、木马上传、CC 攻击样本训练模型请求进入后模型自动识别异常特征、变形绕过攻击未知新型 0day 攻击规则库无特征也能识别拦截。WAF 黑白名单 关键检测内容黑名单拦截匹配攻击特征直接阻断URL/GET 参数union select、script、eval、../ 路径穿越等注入特征POST 上传文件php、phtml 后缀木马文件、图片马Cookie / 请求头恶意脚本、数据库注入语句请求行为高频 CC 扫描、批量爆破接口。白名单放行可信 IP、内部接口、合法正常参数格式绕过检测不拦截。演示链路Python Flask 模拟 WAF PHP Curl 模拟客户端逻辑流程Python Flask 搭建独立 WAF 检测平台接收所有前端请求PHP 业务使用 curl 把客户端原始请求转发给 Flask WAFWAF 通过规则 / AI 模型判定是否恶意返回拦截 / 放行结果放行则转发至真实 PHP 业务接口。防护分层总结由外到内完整安全体系1、流量层WAF/AI 流量检测第一道拦截绝大多数攻击2、Web 服务层Nginx/Apache 限制上传大小、禁止访问脚本目录3、PHP 全局配置php.ini open_basedir、disable_functions、关闭远程包含4、代码层类型校验、filter_var、XSS 转义、命令过滤、PDO 预编译防 SQL 注入 五层防护层层兜底单一防御失效时其他层可拦截攻击。