PHP安全编程实践

输入验证必须放在第一位。很多漏洞都源于对用户输入过于信任。别以为前端做了验证就万事大吉,攻击者直接伪造请求就能绕过前端。建议用filter_var函数配合正则表达式做严格校验。比如邮箱验证不要简单用strpos判断@符号,得用FILTER_VALIDATE_EMAIL过滤器。对于数字型参数,一定要用intval或floatval转换类型,别直接扔进SQL查询。

说到SQL注入,虽然现在都用PDO预处理了,但有些细节还是要注意。比如参数绑定必须严格对应类型,字符串用PDO::PARAM_STR,整数用PDO::PARAM_INT。别小看这个类型指定,我就遇到过用PARAM_STR绑定整数字段导致索引失效的性能问题。另外表名和字段名不能参数化绑定,这类动态内容要白名单验证,实在不行至少得用反引号包裹。

文件上传功能简直是重灾区。除了检查文件类型,更要检测文件内容。光靠$_FILES的type字段根本不靠谱,得用finfo_file读取魔数判断真实类型。服务器上存储时一定要重命名,最好用随机字符串生成新文件名。千万别把用户上传的文件放在Web目录下,要放到无法直接访问的目录,通过PHP脚本控制访问权限。

XSS防护要分场景。普通的htmlspecialchars默认用ENT_QUOTES编码单双引号,但如果是输出到JavaScript变量里,记得加上JSON_HEX_TAG参数。富文本内容处理建议用HTMLPurifier这类专业库,自己写正则太容易漏规则。在设置Cookie时别忘了带上HttpOnly属性,这样能有效防止XSS窃取会话ID。

会话安全方面要注意设置合理的超时时间。敏感操作最好加入二次验证,比如修改密码时需要输入原密码。生成验证码时注意背景干扰线和字符扭曲度,别用简单的GD库默认字体。重要操作要记录详细日志,包括操作时间、IP地址、用户代理和请求参数,但切记别把密码等敏感信息记到日志里。

密码存储现在都应该用password_hash函数,千万别再自己写加密逻辑。默认使用的BCRYPT算法足够安全,成本因子建议设为12以上。用户登录失败次数要有限制,超过阈值就锁定账户或要求验证码。改密功能必须验证原密码,发送邮件时要使用一次性令牌且设置较短有效期。

文件包含漏洞在老旧系统中很常见。绝对不要直接使用用户输入作为包含路径,如果需要动态加载,必须严格限制可包含的文件范围。建议关闭allow_url_include配置,避免远程文件包含风险。对上传的ZIP文件要特别注意,解压前要检查文件数量大小,防止压缩炸弹。

命令行脚本也不能忽视安全。传入的参数要用getopt解析,别直接访问$argv数组。长时间运行的脚本要设置内存限制,避免内存泄漏导致服务器崩溃。定时任务记得检查是否已有实例在运行,防止重复执行产生脏数据。

最后提醒几个配置要点:display_errors生产环境必须关闭,error_log要设置正确路径。open_basedir能限制PHP可访问的目录范围。定期更新PHP版本很重要,很多安全漏洞在老版本中修复不了。项目上线前用静态分析工具扫一遍代码,能发现不少潜在问题。

安全防护没有银弹,关键是要在开发过程中养成安全思维。每次写代码时多问一句"这样写会不会被恶意利用",就能避免很多低级错误。记住,安全不是功能特性,而是开发生命周期中必须贯穿始终的底线。

相关推荐
lqj_本人1 小时前
深入解析Qt for OpenHarmony的CMake构建系统与常见陷阱
开发语言·qt
b***74882 小时前
PHP在电子商务系统中的构建
开发语言·php
岚天start2 小时前
Java程序生成Heap Dump堆内存快照文件的多种方法
开发语言·python·pycharm
翼龙云_cloud2 小时前
亚马逊云渠道商:aws安全组没有加ip用ip访问会有什么问题?
运维·tcp/ip·安全·云计算·aws
天马行空-2 小时前
ES 精准匹配 和 模糊查询的实现方式
java·开发语言
Z***25802 小时前
Java计算机视觉
java·开发语言·计算机视觉
Tiger_shl2 小时前
SqlConnection、SqlCommand 和 SqlDataAdapter
开发语言·数据库·c#
一点事2 小时前
ruoyi:集成mybatisplus实现mybatis增强
java·开发语言·mybatis
BingoGo2 小时前
PHP8.6 新的 RFC 提案 Context Managers 优雅管理资源生命周期
后端·php