Skip to content

Commit 184cfc2

Browse files
committed
fix: bloquer les appels de fonctions PHP dangereuses dans les templates email
Ajout des fonctions dangereuses (system, exec, file_get_contents, env, etc.) et des superglobales dans dangerous_content_patterns() pour empêcher l'injection de code via les expressions Blade {{ }}.
1 parent 56eccff commit 184cfc2

2 files changed

Lines changed: 44 additions & 0 deletions

File tree

app/functions.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -432,9 +432,13 @@ function dangerous_content_patterns(): array
432432
'/\?>/i',
433433
'/@php\b/i',
434434
'/@endphp\b/i',
435+
'/@shell\b/i',
435436
'/\{\!\!.*?\!\!\}/s',
436437
'/@(include|extends|component|each|includeIf|includeWhen|includeFirst)\s*\(/i',
437438
'/@(yield|section|stack|push|prepend)\s*\(/i',
439+
'/\b(?:env|exec|shell_exec|system|passthru|proc_open|popen|pcntl_exec|eval|assert|preg_replace|create_function|require|unlink|fopen|file_get_contents|file_put_contents|file|readfile|base64_decode|gzinflate|gzuncompress|gzdecode|gzcompress|gzdeflate|gzencode|ini_set|set_time_limit|error_reporting|ini_get|ini_restore|ini_alter|unserialize|serialize|var_dump|print_r|debug_backtrace|debug_print_backtrace|dump|die|exit|phpinfo|php_uname|getenv|get_current_user|getmyuid|getmygid|getmypid|getmyinode|getlastmod|getprotobyname|getprotobynumber|getservbyname|getservbyport)\s*\(/i',
440+
'/\$(?:_ENV|_SERVER|_GET|_POST|_REQUEST|_SESSION|_COOKIE)\b/i',
441+
'/\.env\b/i',
438442
];
439443
}
440444
}

tests/Feature/Admin/Personalization/EmailTemplateControllerTest.php

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,46 @@ public function test_email_template_update()
7373
$response->assertStatus(302);
7474
}
7575

76+
public function test_email_template_store_rejects_dangerous_function_calls()
77+
{
78+
$data = [
79+
'name' => 'Test Template',
80+
'subject' => 'Test Subject',
81+
'content' => "{{ system('id') }}",
82+
'button_text' => 'Test Button',
83+
'hidden' => false,
84+
'locale' => 'fr_FR',
85+
];
86+
87+
$response = $this->performAdminAction('POST', route('admin.personalization.email_templates.store'), $data);
88+
89+
$response->assertStatus(302);
90+
$response->assertSessionHas('error');
91+
$this->assertDatabaseMissing('email_templates', ['name' => 'Test Template']);
92+
}
93+
94+
public function test_email_template_update_rejects_dangerous_function_calls()
95+
{
96+
$this->seed(EmailTemplateSeeder::class);
97+
$emailTemplate = EmailTemplate::first();
98+
99+
$data = [
100+
'name' => 'Updated Template',
101+
'subject' => 'Updated Subject',
102+
'content' => "{{ file_get_contents('.env') }}",
103+
'button_text' => 'Updated Button',
104+
'hidden' => true,
105+
'locale' => 'fr_FR',
106+
];
107+
108+
$response = $this->performAdminAction('PUT', route('admin.personalization.email_templates.update', $emailTemplate), $data);
109+
110+
$response->assertStatus(302);
111+
$response->assertSessionHas('error');
112+
$this->assertDatabaseMissing('email_templates', ['id' => $emailTemplate->id, 'content' => "{{ file_get_contents('.env') }}"]);
113+
}
114+
115+
76116
public function test_email_template_delete()
77117
{
78118
$this->seed(EmailTemplateSeeder::class);

0 commit comments

Comments
 (0)