Skip to content

Commit fe0a6e3

Browse files
authored
Merge pull request #155 from codebar-ag/main
main/production
2 parents 55522cc + 976817c commit fe0a6e3

3 files changed

Lines changed: 42 additions & 1 deletion

File tree

app/Providers/AppServiceProvider.php

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
use Illuminate\Foundation\Application;
3232
use Illuminate\Support\Facades\Route;
3333
use Illuminate\Support\ServiceProvider;
34+
use Symfony\Component\HttpFoundation\Request as SymfonyRequest;
3435

3536
class AppServiceProvider extends ServiceProvider
3637
{
@@ -39,7 +40,8 @@ class AppServiceProvider extends ServiceProvider
3940
*/
4041
public function register(): void
4142
{
42-
//
43+
// Ignore malformed _method / X-HTTP-Method-Override values (bots) instead of throwing SuspiciousOperationException.
44+
SymfonyRequest::setAllowedHttpMethodOverride(['PUT', 'PATCH', 'DELETE']);
4345
}
4446

4547
/**
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Tests\Feature;
6+
7+
use App\Http\Middleware\VerifyCsrfToken;
8+
use Tests\TestCase;
9+
10+
class HttpMethodOverrideTest extends TestCase
11+
{
12+
public function test_malicious_method_override_does_not_throw(): void
13+
{
14+
$response = $this->withoutMiddleware(VerifyCsrfToken::class)
15+
->post('/', ['_method' => 'FOO123']);
16+
17+
$response->assertStatus(405);
18+
}
19+
}

tests/Feature/ProfileInformationTest.php

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
namespace Tests\Feature;
66

77
use App\Enums\Weekday;
8+
use App\Http\Middleware\VerifyCsrfToken;
89
use App\Models\User;
910
use App\Service\TimezoneService;
1011
use Illuminate\Foundation\Testing\RefreshDatabase;
@@ -50,4 +51,23 @@ public function test_profile_information_can_be_updated(): void
5051
$this->assertEquals($timezone, $user->timezone);
5152
$this->assertEquals(Weekday::Sunday, $user->week_start);
5253
}
54+
55+
public function test_profile_information_can_be_updated_via_post_with_method_spoofing(): void
56+
{
57+
$user = User::factory()->create();
58+
$timezone = app(TimezoneService::class)->getTimezones()[0];
59+
$this->actingAs($user);
60+
61+
$response = $this->withoutMiddleware(VerifyCsrfToken::class)
62+
->post('/user/profile-information', [
63+
'_method' => 'PUT',
64+
'name' => 'Spoofed Put Name',
65+
'email' => $user->email,
66+
'timezone' => $timezone,
67+
'week_start' => Weekday::Sunday->value,
68+
]);
69+
70+
$response->assertValid(errorBag: 'updateProfileInformation');
71+
$this->assertSame('Spoofed Put Name', $user->fresh()->name);
72+
}
5373
}

0 commit comments

Comments
 (0)