diff --git a/app/Http/Controllers/Admin/SiteSubscriptionController.php b/app/Http/Controllers/Admin/SiteSubscriptionController.php index 6d5ea83..f2f4359 100644 --- a/app/Http/Controllers/Admin/SiteSubscriptionController.php +++ b/app/Http/Controllers/Admin/SiteSubscriptionController.php @@ -211,6 +211,11 @@ class SiteSubscriptionController extends Controller { $this->ensurePlatformAdmin($request); + // 安全阀:必须显式声明 download=1,避免浏览器预取/误触发导致频繁导出 + if ((string) $request->query('download', '') !== '1') { + abort(400, 'download=1 required'); + } + $filters = [ 'status' => trim((string) $request->query('status', '')), 'keyword' => trim((string) $request->query('keyword', '')), diff --git a/resources/views/admin/site_subscriptions/index.blade.php b/resources/views/admin/site_subscriptions/index.blade.php index a6f7923..f7c3590 100644 --- a/resources/views/admin/site_subscriptions/index.blade.php +++ b/resources/views/admin/site_subscriptions/index.blade.php @@ -131,6 +131,7 @@

工具

+ diff --git a/tests/Feature/AdminSiteSubscriptionExportDownloadSafetyValveTest.php b/tests/Feature/AdminSiteSubscriptionExportDownloadSafetyValveTest.php new file mode 100644 index 0000000..0f8f669 --- /dev/null +++ b/tests/Feature/AdminSiteSubscriptionExportDownloadSafetyValveTest.php @@ -0,0 +1,33 @@ +seed(); + + $this->post('/admin/login', [ + 'email' => 'platform.admin@demo.local', + 'password' => 'Platform@123456', + ])->assertRedirect('/admin'); + } + + public function test_export_should_require_download_flag(): void + { + $this->loginAsPlatformAdmin(); + + $this->get('/admin/site-subscriptions/export') + ->assertStatus(400) + ->assertSee('download=1 required'); + + $this->get('/admin/site-subscriptions/export?download=1') + ->assertOk(); + } +} diff --git a/tests/Feature/AdminSiteSubscriptionExportTest.php b/tests/Feature/AdminSiteSubscriptionExportTest.php index 2fbf69a..7c3c998 100644 --- a/tests/Feature/AdminSiteSubscriptionExportTest.php +++ b/tests/Feature/AdminSiteSubscriptionExportTest.php @@ -53,7 +53,7 @@ class AdminSiteSubscriptionExportTest extends TestCase 'activated_at' => now()->subDays(1), ]); - $res = $this->get('/admin/site-subscriptions/export'); + $res = $this->get('/admin/site-subscriptions/export?download=1'); $res->assertOk(); $res->assertHeader('content-type', 'text/csv; charset=UTF-8');