PHP 怎么GDPR合规

wen PHP项目 2

本文目录导读:

PHP 怎么GDPR合规

  1. 数据收集与最小化
  2. 加密与传输安全
  3. 用户权利实现(核心)
  4. 同意管理(Cookie 与追踪)
  5. 日志与审计
  6. 数据泄露通知(72小时)
  7. 框架特定配置
  8. 数据处理记录(RoPA)
  9. 第三方服务
  10. 关键 PHP 配置
  11. 测试与审计清单
  12. 文档化

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 错误日志和访问日志中过滤 passwordtoken 字段。

    // 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

  • 加密默认密钥.envAPP_KEY 必须设置。
  • 数据库加密:使用 encrypted:cast
    class User extends Model {
      protected $casts = [
          'phone' => 'encrypted', // Laravel 7+ 自动加密
          'ssn' => 'encrypted',
      ];
    }

Symfony

  • 使用 symfony/encryptor 组件加密数据。
  • 配置 framework.session.cookie_securecookie_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 侧的任务是技术实现可追溯、可删除、可加密

抱歉,评论功能暂时关闭!