Skip to content

Commit b7b50b3

Browse files
authored
Feature/add security header (#319)
1 parent 1f209f7 commit b7b50b3

37 files changed

+333
-178
lines changed

app/Http/Controllers/User/DashboardController.php

Lines changed: 0 additions & 33 deletions
This file was deleted.

app/Http/Middleware/CacheHeaders.php

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace App\Http\Middleware;
6+
7+
use Closure;
8+
use Illuminate\Http\Request;
9+
use Illuminate\Support\Facades\Auth;
10+
use Symfony\Component\HttpFoundation\Response;
11+
12+
final class CacheHeaders
13+
{
14+
public function handle(Request $request, Closure $next): Response
15+
{
16+
/**
17+
* @var \Illuminate\Http\Response $response
18+
*/
19+
$response = $next($request);
20+
21+
if (Auth::check()) {
22+
$response->setCache(
23+
options: [
24+
'private' => true,
25+
'max_age' => 0,
26+
's_maxage' => 0,
27+
'no_store' => true,
28+
],
29+
);
30+
} else {
31+
$response->setCache(
32+
options: [
33+
'public' => true,
34+
'max_age' => 60,
35+
's_maxage' => 60,
36+
],
37+
);
38+
39+
foreach ($response->headers->getCookies() as $cookie) {
40+
$response->headers->removeCookie(
41+
name: $cookie->getName(),
42+
);
43+
}
44+
}
45+
46+
return $response;
47+
}
48+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace App\Http\Middleware\Security;
6+
7+
use Closure;
8+
use Illuminate\Http\Request;
9+
use Symfony\Component\HttpFoundation\Response;
10+
11+
final class ContentSecurityPolicy
12+
{
13+
public function handle(Request $request, Closure $next): Response
14+
{
15+
/**
16+
* @var Response $response
17+
*/
18+
$response = $next($request);
19+
20+
$response->headers->add([
21+
'Content-Security-Policy' => "default-src 'self'; script-src 'unsafe-inline'; style-src 'unsafe-inline'; img-src *;",
22+
]);
23+
24+
return $response;
25+
}
26+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace App\Http\Middleware\Security;
6+
7+
use Closure;
8+
use Illuminate\Http\Request;
9+
use Symfony\Component\HttpFoundation\Response;
10+
11+
final class PermissionsPolicy
12+
{
13+
public function handle(Request $request, Closure $next): Response
14+
{
15+
/**
16+
* @var Response $response
17+
*/
18+
$response = $next($request);
19+
20+
$response->headers->add([
21+
'Permissions-Policy' => 'geolocation=(self), microphone=()',
22+
]);
23+
24+
return $response;
25+
}
26+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace App\Http\Middleware\Security;
6+
7+
use Closure;
8+
use Illuminate\Http\Request;
9+
use Symfony\Component\HttpFoundation\Response;
10+
11+
final class ReferrerPolicy
12+
{
13+
public function handle(Request $request, Closure $next): Response
14+
{
15+
/**
16+
* @var Response $response
17+
*/
18+
$response = $next($request);
19+
20+
$response->headers->add([
21+
'Referrer-Policy' => 'no-referrer',
22+
]);
23+
24+
return $response;
25+
}
26+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace App\Http\Middleware\Security;
6+
7+
use Closure;
8+
use Illuminate\Http\Request;
9+
use Symfony\Component\HttpFoundation\Response;
10+
11+
final class StrictTransportSecurity
12+
{
13+
public function handle(Request $request, Closure $next): Response
14+
{
15+
/**
16+
* @var Response $response
17+
*/
18+
$response = $next($request);
19+
20+
$response->headers->add([
21+
'Strict-Transport-Security' => 'max-age=31536000; includeSubDomains; preload',
22+
]);
23+
24+
return $response;
25+
}
26+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace App\Http\Middleware\Security;
6+
7+
use Closure;
8+
use Illuminate\Http\Request;
9+
use Symfony\Component\HttpFoundation\Response;
10+
11+
final class XFrameOption
12+
{
13+
public function handle(Request $request, Closure $next): Response
14+
{
15+
/**
16+
* @var Response $response
17+
*/
18+
$response = $next($request);
19+
20+
$response->headers->add([
21+
'X-Frame-Options' => 'deny',
22+
]);
23+
24+
return $response;
25+
}
26+
}

app/Http/Middleware/TrackLastActivity.php

Lines changed: 0 additions & 28 deletions
This file was deleted.

app/Livewire/Components/Discussion/Comments.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ public function comments(): Collection
7575
$replies = collect();
7676

7777
// @phpstan-ignore-next-line
78-
foreach ($this->discussion->replies->load(['allChildReplies', 'user']) as $reply) {
78+
foreach ($this->discussion->replies->load(['allChildReplies', 'user', 'user.media']) as $reply) {
7979
/** @var Reply $reply */
8080
if ($reply->allChildReplies->isNotEmpty()) {
8181
foreach ($reply->allChildReplies as $childReply) {

app/Livewire/Components/User/Articles.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ final class Articles extends Component implements HasActions, HasForms
2929
#[Computed]
3030
public function articles(): LengthAwarePaginator
3131
{
32-
return Article::with(['user', 'tags', 'reactions'])
32+
return Article::with('tags', 'reactions')
3333
->where('user_id', Auth::id())
3434
->latest()
3535
->paginate(10);

0 commit comments

Comments
 (0)