PHP安全实战:蓝队工程师的防注入秘籍
|
PHP应用长期面临SQL注入、XSS、命令执行等高频攻击,蓝队工程师需从代码层构建纵深防御。防御不是堆砌WAF规则,而是让漏洞在源头失去生长土壤。
AI生成结论图,仅供参考 参数化查询是阻断SQL注入的基石。无论使用PDO还是MySQLi,必须严格分离SQL逻辑与用户数据:绑定变量(bindParam)而非拼接字符串,禁用mysql_等废弃函数。即使输入看似“可控”,如ID字段或下拉选项值,也需强制走预处理流程——攻击者常通过修改前端HTML、重放请求绕过表单限制。 输入验证需双向发力:服务端白名单校验不可省略,客户端仅作体验优化。对手机号、邮箱、用户名等字段,采用filter_var配合FILTER_VALIDATE_常量;对自由文本,明确长度上限并过滤控制字符(如chr(0))。特别注意JSON接口:json_decode后应检查返回值是否为NULL,避免因非法JSON触发后续逻辑异常。 输出编码是防御XSS的关键一环。根据上下文选择对应编码方式:HTML内容用htmlspecialchars($str, ENT_QUOTES, 'UTF-8');JavaScript内联脚本中嵌入变量时,先JSON编码再放入引号内;URL参数则用urlencode()。切忌全局addslashes()替代上下文感知编码——它无法防御DOM型XSS,且在多字节编码场景下可能被绕过。 文件操作风险极高。禁止直接拼接用户输入构造文件路径,尤其警惕“../”遍历。读取配置或模板时,使用白名单限定允许的文件名(如['index', 'about']),或通过映射数组转换;上传文件须重命名(如uniqid().md5_file())、校验MIME类型(不依赖$_FILES['type'])、限制大小,并存放于Web根目录外。临时文件处理完毕后立即unlink()。 命令执行漏洞常藏于system()、exec()、shell_exec()调用中。若业务确需调用外部程序,优先使用proc_open()并显式指定环境变量和工作目录;绝对避免将用户输入传入shell命令字符串。对已知安全的场景(如ping检测),改用纯PHP实现(如fsockopen()检测端口连通性)。 错误信息绝不暴露给前端。生产环境禁用display_errors,开启log_errors并将日志写入受限目录;自定义错误处理器需过滤敏感路径和数据库连接信息。同时,设置合理的HTTP头:Content-Security-Policy限制资源加载域,X-Content-Type-Options防止MIME嗅探,X-Frame-Options防御点击劫持。 安全是持续过程,非一次性配置。定期扫描composer依赖(使用composer audit或sensio-labs/security-checker),及时升级存在CVE的扩展;对核心功能做渗透测试,重点验证越权访问与逻辑绕过;将安全检查纳入CI/CD流水线,例如用PHPStan检测危险函数调用。真正的防线,始于每一行代码的敬畏之心。 (编辑:92站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |

