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

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

相关推荐
李妍.2 小时前
02Numpy基础(上)
开发语言·python
TheBestRucy2 小时前
Python 九阳神功之贰:面向对象(下)
开发语言·python
三垣网安2 小时前
一次学校系统水平越权漏洞的实战测试记录
安全
AI_小站3 小时前
刚面完百度的 Agent 开发岗,我才发现:世界就是个巨大的草台班子
java·开发语言·人工智能·spring·百度·langchain
felixking3 小时前
C++20 协程
开发语言·c++·协程
Zane1994125 小时前
CAS 与原子类:Java 如何实现无锁编程
java·开发语言
码农颜6 小时前
6.3 主函数流程剖析
开发语言·php
蓝速科技6 小时前
蓝速科技信创落地:平衡安全合规与项目成本的实战方案
android·运维·人工智能·科技·安全·电脑·鸿蒙
TheBestRucy6 小时前
Python 九阳神功:从零筑基到线程飞升
服务器·开发语言·网络·人工智能·python
研☆香6 小时前
聊一聊前端的常见字 关键字
开发语言·前端·javascript