本文目录导读:

在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更安全但可能影响用户体验)。