PHP项目Laravel Cookie安全属性设置

wen PHP项目 6

本文目录导读:

PHP项目Laravel Cookie安全属性设置

  1. 基础配置(config/session.php)
  2. 环境变量配置(.env)
  3. 创建自定义Cookie
  4. 中间件配置
  5. 注册中间件
  6. 自定义Cookie生成器
  7. 测试验证
  8. 安全最佳实践
  9. 安全检查清单
  10. 生产环境部署建议

在Laravel中设置Cookie的安全属性非常重要,以下是完整的配置和安全实践指南:

基础配置(config/session.php)

// config/session.php
return [
    // ... 其他配置
    // Cookie仅在HTTPS连接时发送
    'secure' => env('SESSION_SECURE_COOKIE', true),
    // 防止JavaScript访问Cookie(XSS防护)
    'http_only' => true,
    // 跨站请求防护
    'same_site' => 'lax', // 可选: lax, strict, none
    // Cookie名称
    'cookie' => env('SESSION_COOKIE', 'laravel_session'),
    // Cookie路径
    'path' => '/',
    // Cookie域名
    'domain' => env('SESSION_DOMAIN', null),
];

环境变量配置(.env)

# 生产环境建议配置
SESSION_SECURE_COOKIE=true
SESSION_HTTP_ONLY=true
SESSION_SAME_SITE=lax
# 如果有自定义域名
SESSION_DOMAIN=.example.com

创建自定义Cookie

use Illuminate\Support\Facades\Cookie;
use Illuminate\Http\Response;
// 在控制器中
public function setCustomCookie(Response $response)
{
    // 使用Cookie facade
    $cookie = Cookie::make('custom_cookie', 'value', 60, '/', null, true, true, false, 'lax');
    // 或者在现代Laravel中使用Cookie::queue
    Cookie::queue('custom_cookie', 'value', 60, '/', null, true, true, false, 'lax');
    return response('Cookie set')->cookie($cookie);
}

中间件配置

// app/Http/Middleware/ForceSecureCookies.php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
class ForceSecureCookies
{
    public function handle(Request $request, Closure $next)
    {
        $response = $next($request);
        // 强制所有cookies使用secure属性(生产环境)
        if (app()->environment('production')) {
            $cookies = $response->headers->getCookies();
            foreach ($cookies as $cookie) {
                $response->headers->setCookie(
                    new \Symfony\Component\HttpFoundation\Cookie(
                        $cookie->getName(),
                        $cookie->getValue(),
                        $cookie->getExpiresTime(),
                        $cookie->getPath(),
                        $cookie->getDomain(),
                        true, // secure
                        true, // httpOnly
                        false,
                        'lax'
                    )
                );
            }
        }
        return $response;
    }
}

注册中间件

// app/Http/Kernel.php
protected $middlewareGroups = [
    'web' => [
        // ... 其他中间件
        \App\Http\Middleware\ForceSecureCookies::class,
    ],
];

自定义Cookie生成器

// app/Helpers/CookieHelper.php
namespace App\Helpers;
use Illuminate\Support\Facades\Cookie;
class CookieHelper
{
    public static function makeSecureCookie(
        string $name,
        string $value,
        int $minutes = 60,
        string $path = '/',
        string $domain = null,
        bool $secure = true,
        bool $httpOnly = true,
        string $sameSite = 'lax'
    ) {
        return Cookie::make(
            $name,
            $value,
            $minutes,
            $path,
            $domain,
            $secure,
            $httpOnly,
            false,
            $sameSite
        );
    }
}

测试验证

// tests/Feature/CookieSecurityTest.php
namespace Tests\Feature;
use Tests\TestCase;
use Illuminate\Foundation\Testing\RefreshDatabase;
class CookieSecurityTest extends TestCase
{
    public function test_cookies_have_secure_attributes()
    {
        $response = $this->get('/test-cookie-endpoint');
        $cookies = $response->headers->getCookies();
        foreach ($cookies as $cookie) {
            $this->assertTrue($cookie->isSecure(), 'Cookie should be secure');
            $this->assertTrue($cookie->isHttpOnly(), 'Cookie should be httpOnly');
            $this->assertSame('lax', $cookie->getSameSite(), 'Cookie should have sameSite=lax');
        }
    }
}

安全最佳实践

// 登录后设置安全session
public function login(Request $request)
{
    // ... 验证逻辑
    $request->session()->regenerate();
    $request->session()->put('user_id', $user->id);
    // 确保session cookie安全
    config(['session.secure' => true]);
    config(['session.http_only' => true]);
    config(['session.same_site' => 'strict']);
    return response()->json(['message' => 'Login successful']);
}
// 敏感操作使用 stricter same-site
public function sensitiveOperation(Request $request)
{
    if (config('session.same_site') !== 'strict') {
        // 临时提升安全级别
        config(['session.same_site' => 'strict']);
    }
    // 执行敏感操作
}

安全检查清单

// app/Console/Commands/CheckCookieSecurity.php
namespace App\Console\Commands;
use Illuminate\Console\Command;
class CheckCookieSecurity extends Command
{
    protected $signature = 'security:check-cookies';
    protected $description = '检查Cookie安全配置';
    public function handle()
    {
        $this->info('Cookie安全配置检查:');
        $checks = [
            'secure' => config('session.secure') ? '✔' : '✘ 需要HTTPS',
            'http_only' => config('session.http_only') ? '✔' : '✘ 建议开启',
            'same_site' => in_array(config('session.same_site'), ['lax', 'strict']) ? '✔' : '✘ 建议lax或strict',
        ];
        foreach ($checks as $key => $status) {
            $this->line(sprintf('  %-15s: %s', $key, $status));
        }
        if (in_array('✘', $checks)) {
            $this->error('存在安全问题,请修改配置!');
            return Command::FAILURE;
        }
        $this->info('所有Cookie安全配置正确!');
        return Command::SUCCESS;
    }
}

生产环境部署建议

# 生产环境 .env 配置
APP_ENV=production
APP_DEBUG=false
APP_URL=https://your-domain.com
SESSION_SECURE_COOKIE=true
SESSION_HTTP_ONLY=true
SESSION_SAME_SITE=lax
# 如果使用CDN,设置正确的domain
SESSION_DOMAIN=.your-domain.com

这些配置能确保:

  • Secure:Cookie只在HTTPS连接中传输
  • HttpOnly:防止XSS攻击窃取Cookie
  • SameSite:防止CSRF攻击
  • Domain:限制Cookie的作用域

根据你的应用需求,可以适当调整SameSite策略(lax适合大多数场景,strict更安全但可能影响用户体验)。

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