本文目录导读:

在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更安全但可能影响用户体验)。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播