本手册基于OWASP Top 10及PHP官方安全实践,系统梳理PHP开发中CSRF防护、密码哈希存储、SQL注入防御等核心安全环节。所有技术方案均经过生产环境验证,符合PSR安全标准及行业合规要求。

一、CSRF防护机制深度审计
跨站请求伪造(CSRF)攻击通过诱导用户执行非预期操作实现,PHP审计需重点关注以下层面:
-
令牌生成规范:需使用
random_bytes()或openssl_random_pseudo_bytes()生成加密安全随机数,长度不低于32字节。禁止使用mt_rand()等伪随机函数,其种子可被预测。 -
令牌验证逻辑:服务器端需验证请求中
csrf_token与会话存储值的一致性,且需校验来源请求的Origin/Referer头。表单令牌需设置单次有效性(提交后立即失效)。
SameSite Cookie属性:会话Cookie必须配置SameSite=Lax或Strict,阻断第三方站点携带Cookie发起请求。PHP 7.3+可通过session_set_cookie_params()设置:
session_set_cookie_params([
'lifetime' => 0,
'path' => '/',
'domain' => 'example.com',
'secure' => true,
'httponly' => true,
'samesite' => 'Lax'
]);二、密码哈希存储最佳实践
PHP密码安全的核心是不可逆哈希+动态盐值,严禁明文存储或使用弱哈希算法(如MD5、SHA1)。
-
算法选择:优先使用
PASSWORD_DEFAULT(当前默认bcrypt,未来自动升级),或显式指定PASSWORD_BCRYPT。避免使用password_hash()的cost参数低于10(默认值10,建议12-14,需平衡服务器性能)。 -
哈希验证流程:必须使用
password_verify($inputPassword, $storedHash)验证,禁止自行拆分哈希与盐值比对。password_needs_rehash()可检测哈希算法是否需要升级(如从bcrypt迁移至argon2)。 -
盐值处理:
password_hash()会自动生成随机盐值并嵌入结果,无需手动添加。禁止硬编码盐值(如$salt = 'fixed_salt';),否则会导致彩虹表攻击风险。
密码哈希算法特性对比表
|
算法类型 |
存储格式示例 |
抗暴力破解能力 |
内存消耗 |
PHP支持版本 |
|---|---|---|---|---|
|
MD5 |
32位十六进制 |
极低(易被彩虹表破解) |
低 |
全版本(已废弃) |
|
SHA256 |
64位十六进制 |
低(GPU可高速计算) |
低 |
全版本(不推荐) |
|
bcrypt |
$2y10[22位盐][31位哈希] |
高(自适应成本因子) |
中 |
PHP 5.3.7+ |
|
Argon2i |
argon2iv=19m=1024,t=2,p=2[盐][哈希] |
极高(内存硬约束) |
高 |
PHP 7.2+ |
三、常见Web漏洞防御体系
除CSRF与密码安全外,需同步审计以下高风险漏洞:
-
SQL注入:强制使用预处理语句(PDO或MySQLi),禁止字符串拼接SQL。PDO需禁用模拟预处理(
PDO::ATTR_EMULATE_PREPARES=false),避免驱动层转换漏洞。 -
XSS跨站脚本:输出到HTML页面的用户输入需经
htmlspecialchars($data, ENT_QUOTES|ENT_HTML5, 'UTF-8')转义;富文本内容需通过HTML Purifier过滤恶意标签。 -
文件上传漏洞:限制上传文件MIME类型(通过
finfo_file()检测,而非仅依赖$_FILES['file']['type']),存储路径与Web根目录隔离,重命名文件为随机字符串(如md5(uniqid(mt_rand(), true)))。 -
会话安全:会话ID需通过
session_regenerate_id(true)定期轮换(如登录成功后);禁止在URL中传递会话ID(session.use_trans_sid=0);会话存储目录权限设置为0700。
四、安全审计实施清单
-
检查所有用户输入点(GET/POST/COOKIE/HTTP头)是否经过过滤(使用
filter_var()或自定义白名单)。 -
验证错误报告配置:
display_errors=Off,log_errors=On,避免敏感信息泄露。 -
确认敏感操作(如支付、修改密码)启用二次验证(短信/邮箱验证码,有效期≤15分钟)。
-
审计依赖组件安全性:通过
composer audit检查第三方库已知漏洞,及时更新至安全版本。 -
测试异常场景:模拟令牌过期、重复提交、超长输入等情况,验证系统容错机制。

