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版本很重要,很多安全漏洞在老版本中修复不了。项目上线前用静态分析工具扫一遍代码,能发现不少潜在问题。

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

相关推荐
Dovis(誓平步青云)几秒前
浇水提醒刚弹出又消失,植物状态别只存一个百分比
开发语言·前端·javascript·pdf·ecmascript·电脑
sunshine22 girl23 分钟前
Java学习六 Java常见API-2--String-3-字符串的截取替换和其他方法
java·开发语言·学习
LOVE️YOU32 分钟前
Python 函数名、函数对象与“把函数作为参数传递”
开发语言·python
sunshine22 girl1 小时前
Java学习六 Java常见API-1-Radom随机数
java·开发语言·学习
可乐鸡翅yeah_1 小时前
hls.js 手动自定义 http 请求 loader,修改请求头实战
开发语言·前端·javascript·网络协议·http·ecmascript·m3u8在线
潼心1412o1 小时前
C++初阶(长期更新)第6讲:类和对象(下)
开发语言·c++·算法
星光开发者2 小时前
基于决策树随机森林算法的小说推荐系统的设计与实现-计算机毕设【课程设计】78485
vue.js·算法·微信小程序·django·php·课程设计·express
夜晚回家2 小时前
Python 零基础入门 | 输入的数字为什么不能直接算
开发语言·python
时间的拾荒人2 小时前
Qt 事件机制全解析:从事件处理到事件过滤器
开发语言·qt·面试
于指尖飞舞2 小时前
java面试题总结
java·开发语言