rudimentary "spam filter"
This commit is contained in:
parent
0a8db68e42
commit
3e97458ee2
6 changed files with 52 additions and 15 deletions
|
@ -27,21 +27,7 @@ public function show(): View {
|
|||
* @throws ValidationException
|
||||
*/
|
||||
public function addEntry(Request $request): RedirectResponse {
|
||||
$this->validate($request, [
|
||||
'name' => 'required',
|
||||
'message' => 'required'
|
||||
]);
|
||||
|
||||
|
||||
GuestbookEntry::insertGuestbookEntry($request);
|
||||
return back()->with('success', 'Entry submitted successfully!');
|
||||
}
|
||||
|
||||
public function banIP(string $addr) {
|
||||
// TODO: Add banning system
|
||||
// $matching_bans = DB::select('SELECT reason FROM guestbook__bans WHERE ip_address = ?', array($request->ip()));
|
||||
// if (!empty($matching_bans)) {
|
||||
// return view('errors.guestbook-ipban')->with('reason', $matching_bans[0]->reason);
|
||||
// }
|
||||
}
|
||||
}
|
||||
|
|
|
@ -47,6 +47,7 @@ class Kernel extends HttpKernel
|
|||
|
||||
protected $routeMiddleware = [
|
||||
'rate_limit' => \App\Http\Middleware\RateLimiter::class,
|
||||
'validator' => \App\Http\Middleware\GuestbookValidate::class,
|
||||
];
|
||||
|
||||
|
||||
|
|
37
app/Http/Middleware/GuestbookValidate.php
Normal file
37
app/Http/Middleware/GuestbookValidate.php
Normal file
|
@ -0,0 +1,37 @@
|
|||
<?php
|
||||
|
||||
namespace App\Http\Middleware;
|
||||
|
||||
use Closure;
|
||||
use Illuminate\Http\Request;
|
||||
use Symfony\Component\HttpFoundation\Response;
|
||||
|
||||
class GuestbookValidate
|
||||
{
|
||||
/**
|
||||
* Handle an incoming request.
|
||||
*
|
||||
* @param \Closure(\Illuminate\Http\Request): (\Symfony\Component\HttpFoundation\Response) $next
|
||||
*/
|
||||
public function handle(Request $request, Closure $next): Response
|
||||
{
|
||||
if (
|
||||
!$request->validate([
|
||||
'name' => 'required',
|
||||
'message' => 'required'
|
||||
]) ||
|
||||
$this->containsUrl($request->get('message')) ||
|
||||
$this->containsUrl($request->get('name'))
|
||||
) {
|
||||
return response()->view('errors.guestbook-invalid', [], 400);
|
||||
}
|
||||
return $next($request);
|
||||
}
|
||||
|
||||
public function containsUrl($str) {
|
||||
$matches = [];
|
||||
$pattern = '/\b(?:https?|ftp|www)(:\/\/)*[-A-Z0-9+&@#\/%?=~_|$!:,.;]*[A-Z0-9+&@#\/%=~_|$]/i';
|
||||
preg_match_all($pattern, $str, $matches);
|
||||
return count($matches[0]);
|
||||
}
|
||||
}
|
|
@ -5,7 +5,7 @@
|
|||
|
||||
return [
|
||||
'name' => env('APP_NAME', 'diskfloppy.me'),
|
||||
'version' => '2024.12.25',
|
||||
'version' => '2024.12.27',
|
||||
'env' => env('APP_ENV', 'production'),
|
||||
'debug' => (bool) env('APP_DEBUG', false),
|
||||
'url' => env('APP_URL', 'http://localhost'),
|
||||
|
|
12
resources/views/errors/guestbook-invalid.blade.php
Normal file
12
resources/views/errors/guestbook-invalid.blade.php
Normal file
|
@ -0,0 +1,12 @@
|
|||
<x-minimal>
|
||||
<x-slot:title>Error dsdf!</x-slot:title>
|
||||
<div class="page-container">
|
||||
<div>
|
||||
<h1 style="margin-top: 0">Error 400: Invalid message!</h1>
|
||||
<hr>
|
||||
<p>Whoa there! Your form submission seems to contain a URL (or one of the fields was left blank)!</p>
|
||||
<br>
|
||||
Click <a href="/guestbook">here</a> to go back to the guestbook.
|
||||
</div>
|
||||
</div>
|
||||
</x-minimal>
|
|
@ -25,4 +25,5 @@
|
|||
Route::get('/music', [MusicController::class, 'show']);
|
||||
Route::get('/rosco', [RoscoController::class, 'show']);
|
||||
Route::post('/guestbook', [GuestbookController::class, 'addEntry'])
|
||||
->middleware('validator')
|
||||
->middleware('rate_limit');
|
||||
|
|
Loading…
Reference in a new issue