本文目录导读:

- 数据收集与最小化
- 加密与传输安全
- 用户权利实现(核心)
- 同意管理(Cookie 与追踪)
- 日志与审计
- 数据泄露通知(72小时)
- 框架特定配置
- 数据处理记录(RoPA)
- 第三方服务
- 关键 PHP 配置
- 测试与审计清单
- 文档化
GDPR(通用数据保护条例)是欧盟的隐私法律,PHP 开发者需要从代码层面、数据处理流程和合规文档三方面着手,以下是针对 PHP 项目(尤其是 Laravel、Symfony 等框架)的实操指南:
数据收集与最小化
- 只收集必要数据:在表单验证时,不要轻易收集 IP、精确地理位置、浏览器指纹等非必要信息。
- 显式同意:勾选框不能默认勾选,保存同意记录(时间戳、版本号、用户 ID)。
- 匿名化/假名化:如果业务允许,存储前对邮箱、手机号进行哈希或加密。
加密与传输安全
- 强制 HTTPS:在 PHP 配置中设置
session.cookie_secure = 1。 - 密码哈希:使用
password_hash()(默认 bcrypt),不要用 MD5/SHA1。 - 数据加密存储:使用
openssl_encrypt()或 Laravel 的Crypt门面对敏感字段(如身份证号)进行加密。
用户权利实现(核心)
GDPR 要求用户拥有访问、更正、删除(被遗忘权)、数据可携带权。
A. 数据访问与可携带权
// 返回给用户所有个人数据(JSON格式)
public function exportData(User $user) {
$personalData = [
'profile' => $user->only(['name', 'email', 'created_at']),
'orders' => $user->orders()->get()->toArray(),
// 其他业务数据
];
return response()->json($personalData);
}
B. 被遗忘权(删除权)
关键点:不仅要删主表数据,还要处理关联数据、日志、备份。
// 使用数据库事务级联删除
DB::transaction(function () use ($user) {
$user->orders()->delete();
$user->logs()->delete();
$user->delete(); // 最后删主表
});
// 异步清理(生产环境用队列)
dispatch(new CleanupUserDataJob($user->id));
注意:如果业务要求保留订单(如税务),则应匿名化而非物理删除:
$user->update([
'email' => 'deleted-'.$user->id.'@anonymized.invalid',
'name' => 'Anonymous User',
]);
C. 更正权
直接提供表单修改,并记录修改日志。
同意管理(Cookie 与追踪)
PHP 中常见的 Cookie 管理:
// 设置只有必要 Cookie(PHP会话)
session_start();
// 非必要 Cookie(如统计分析)需用户明确同意后才设置
if ($_COOKIE['gdpr_consent'] === 'accepted') {
setcookie('analytics_token', bin2hex(random_bytes(16)), [
'expires' => time() + 3600,
'path' => '/',
'secure' => true,
'httponly' => true,
'samesite' => 'Lax'
]);
}
建议使用现成的 Cookie 同意库(如 cookieconsent)配合后端验证。
日志与审计
-
不要记录敏感参数:在 PHP 错误日志和访问日志中过滤
password、token字段。// Log::error('Order failed', ['exception' => $e->getMessage()]); // 不要传用户输入 -
保留期限:设置日志自动清理 cron,并定义数据保留策略(如订单保留 5 年,日志保留 6 个月)。
数据泄露通知(72小时)
PHP 项目需要监控异常并准备应急脚本:
// 邮件/Slack通知 + 记录事件
public function notifyBreach(string $nature, int $affectedUsers) {
// 发送邮件给DPO(数据保护官)
Mail::to('dpo@company.com')->send(new BreachNotification(...));
// 记录事件到审计表
BreachLog::create(['nature' => $nature, 'users_affected' => $affectedUsers]);
}
框架特定配置
Laravel
- 加密默认密钥:
.env中APP_KEY必须设置。 - 数据库加密:使用
encrypted:cast。class User extends Model { protected $casts = [ 'phone' => 'encrypted', // Laravel 7+ 自动加密 'ssn' => 'encrypted', ]; }
Symfony
- 使用
symfony/encryptor组件加密数据。 - 配置
framework.session.cookie_secure和cookie_samesite。
数据处理记录(RoPA)
PHP 作为后端,应提供一个内部接口或后台页面,记录所有个人数据处理活动(目的、分类、保留期限)。
第三方服务
- 云服务商(AWS/Azure):确认数据处理协议(DPA),并启用存储加密。
- 邮件服务(Mailchimp等):确保其提供 GDPR 合规 API。
关键 PHP 配置
在 php.ini 中启用:
session.cookie_secure = 1 session.cookie_httponly = 1 session.cookie_samesite = Lax
测试与审计清单
# 检查安全头部 php -r "echo 'Check headers via curl';" # 扫描硬编码密钥 grep -rn "password\|secret" config/ routes/
文档化
在项目根目录添加 PRIVACY.md,并在代码注释中标记涉及个人数据的函数。
关键提醒:GDPR 合规不仅是技术问题,还需法律顾问确认业务逻辑(如合法利益 vs 用户同意),PHP 侧的任务是技术实现可追溯、可删除、可加密。