02/11/2018, 15:29

Bảo mật với Middleware

Middleware cung cấp một giải pháp khá tiện ích cho việc filtering HTTP các requests vào ứng dụng. Ví dụ, Laravel có chứa một middleware xác thực người dùng đăng nhập vào hệ thống. Nếu user chưa đăng nhập, middleware sẽ chuyển hướng user tới màn hình đăng nhập. Tuy nhiên, nếu user đã đăng nhập rồi, thì middleware sẽ cho phép request được thực hiện tiếp tiến trình xử lý vào ứng dụng.

Middleware cung cấp một giải pháp khá tiện ích cho việc filtering HTTP các requests vào ứng dụng. Ví dụ, Laravel có chứa một middleware xác thực người dùng đăng nhập vào hệ thống. Nếu user chưa đăng nhập, middleware sẽ chuyển hướng user tới màn hình đăng nhập. Tuy nhiên, nếu user đã đăng nhập rồi, thì middleware sẽ cho phép request được thực hiện tiếp tiến trình xử lý vào ứng dụng.

Có vài middleware đã có sẵn trong Laravel framework, bao gồm middlware xác thực, CSRF protection. Tất cả được nằm trong thư mục app/Http/Middleware

1.Tạo Middleware 

php artisan make:middleware mymiddleware (tên middleware)

Câu lệnh này sẽ tạo ra class mymiddleware trong mục app/Http/Middleware.Khi tạo xong sẽ được như thế này

<?php

namespace App\Http\Middleware;

use Closure;

class Mymiddleware
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
          return $next($request);
    }
}

Ví Dụ

<?php

namespace App\Http\Middleware;

use Closure;

class Mymiddleware
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        if ($request->has('diem') && $request['diem'] > 7) {
          //Điều kiện phải có điểm và phải lớn hơn 7 thì mới được vào
          return $next($request);
        }else {
            return redirect()->route('loi');
        }
    }
}

2.Đăng ký Middleware

Global Middleware

Nếu bạn muốn một middleware có thể thực thi trong mọi HTTP request tới ứng dụng của bạn, đơn giản chỉ cần thêm tên class của middleware trong thuộc tính $middleware của class app/Http/Kernel.php

Gán Middleware vào Routes

Nếu bạn muốn gán middleware cho route cụ thể, đầu tiên bạn cần thêm middleware đấy vào trong file app/Http/Kernel.php Mặc định, thuộc tính $routeMiddleware sẽ chứa một số class thuộc middleware của framework Laravel. Để thêm middleware của bạn, đơn giản chỉ là thêm nó vào dach sách và gán từ khóa bạn chọn.

Ví dụ:

protected $routeMiddleware = [
    'auth' => \Illuminate\Auth\Middleware\Authenticate::class,
    'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
    'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
    'can' => \Illuminate\Auth\Middleware\Authorize::class,
    'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
    'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
    'mymiddleware' => \App\Http\Middleware\Mymiddleware::class
];

Khi middleware đã được định nghĩa trong HTTP kernel, bạn có thể sử dụng phương thức middleware cho một route:

Route::get(' / ' ,function(){

})->middleware('Tên middleware');

Ngoài ra bạn cũng có thể gán nhiều middleware cho một route:

Route::get(' / ',function(){

})->middleware('auth','mymiddleware');

Khi đã gán middleware, bạn cũng có thể sử dụng tên đầy đủ của middleware:

 

use App\Http\Middleware\Mymiddleware;

Route::get(' / ',function(){

})->middleware(Mymiddleware::class);

Nhóm Middleware

Thỉnh thoảng bạn muốn nhóm một vài middleware lại trong một khóa để thực hiện gán vào route dễ dàng hơn. Bạn có thể sử dụng thuộc tính $middlewareGroups của HTTP kernel.

Mặc định, Laravel cung cấp sắp 2 nhóm middleware web api chứa những middleware thường sử dụng mà bạn có thể muốn áp dụng cho web UI và API routes:

protected $middlewareGroups = [
    'web' => [
        \App\Http\Middleware\EncryptCookies::class,
        \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
        \Illuminate\Session\Middleware\StartSession::class,
        \Illuminate\View\Middleware\ShareErrorsFromSession::class,
        \App\Http\Middleware\VerifyCsrfToken::class,
        \Illuminate\Routing\Middleware\SubstituteBindings::class,
    ],

    'api' => [
        'throttle:60,1',
        'auth:api',
    ],
];

Nhóm middleware được gán vào routes và controller sử dụng cú pháp tương tự như với từng middleware. Một lần nữa, nhóm middleware làm đơn giản trong việc gán các middleware vào trong một route:

 

Route::get('/ ',function(){

})->middleware('mymiddleware');

Route::group(['middleware' => ['mymiddleware']],function(){

});

 

Ví Dụ

- Tạo middleware vào tạo điều kiện

<?php

namespace App\Http\Middleware;

use Closure;

class Mymiddleware
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        if ($request->has('diem') && $request['diem'] > 7) {
          //Điều kiện phải có điểm và phải lớn hơn 7 thì mới được vào
          return $next($request);
        }else {
            return redirect()->route('loi');
        }
    }
}

- Đăng ký middleware trong file app/Http/Kernel.php

protected $routeMiddleware = [
    'auth' => \Illuminate\Auth\Middleware\Authenticate::class,
    'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
    'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
    'can' => \Illuminate\Auth\Middleware\Authorize::class,
    'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
    'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
    'mymiddleware' => \App\Http\Middleware\Mymiddleware::class
];

- Tạo route và gọi middleware mà mình đã tạo

        Route::get('/diem',function(){
		echo 'Bạn đã đủ điểm';
	})->middleware('mymiddlewear')->name('diem');

	Route::get('/loi',function(){
		echo 'Bạn không đủ điểm';
	})->name('loi');

	Route::get('/nhapdiem',function(){
		return view('admin/nhapdiem');
	});

- Tạo 1 blade nhập điểm

<form action="{{route('diem')}}" method="GET" role="form">
	<legend>Nhập điểm</legend>

	<div class="form-group">
		<label for="">Điểm</label>
		<input type="number" class="form-control" id="" placeholder="Input field" name="diem">
	</div>
	<button type="submit" class="btn btn-primary">Submit</button>
</form>

Kết quả nếu nhập điểm đủ điều kiện thì sẽ vào route('diem') nếu không thì sẽ vào route('loi')

Bài liên quan

Bảo mật với Middleware

Middleware cung cấp một giải pháp khá tiện ích cho việc filtering HTTP các requests vào ứng dụng. Ví dụ, Laravel có chứa một middleware xác thực người dùng đăng nhập vào hệ thống. Nếu user chưa đăng nhập, middleware sẽ chuyển hướng user tới màn hình đăng nhập. Tuy nhiên, nếu user đã đăng nhập rồi, ...

Bui Anh Tu viết 2 tuần trước

Oracle cập nhật bảo mật với 154 bản vá lỗ hổng

Oracle đã phát hành bản vá 154 lỗ hổng trong 54 sản phẩm khác nhau trong đợt cập nhật Critical Patch định kì của hãng. Hơn nửa số bản vá, chính xác là 84, xử lý lỗ hổng liên quan đến khai thác từ xa mà không cần xác thực. Java SE có 24 lỗ hổng, 7 trong số đó được đánh giá mức độ nghiêm trọng ...

Trần Trung Dũng viết 10:11 ngày 18/09/2018

Apple chính thức ra mắt iOS 8 với 50 bản vá lỗi bảo mật

Apple thông báo rằng vào thứ tư (tức thứ năm theo giờ Việt Nam) iOS 8 đã sẵn sàng để tải về. Phiên bản mới nhất dành cho di động đi kèm với hơn 50 bản sửa lỗi lỗ hổng bảo mật. iOS 8 bao gồm các bản sửa lỗi liên quan đến 802.1X, tài khoản, các tính năng, sổ danh bạ, cài đặt app, assets, ...

Trịnh Tiến Mạnh viết 19:59 ngày 17/09/2018

Firefox 32 ra mắt với các bản vá bảo mật và công nghệ Public Key Pinning

Mozilla đã tung ra phiên bản mới Firefox 32 cho Windows, Linux, Mac và Android. Ngoài một số tính năng mới, phiên bản mới nhất này bao gồm các bản vá lỗ hổng bảo mật và hỗ trợ Public Key Pinning. Public Key Pinning giúp bảo vệ người dùng chống lại việc kiểu tấn công man-in-the-middle (MitM) ...

Hoàng Hải Đăng viết 19:51 ngày 17/09/2018

Nmap 6.47 – Công cụ quét cổng và lỗ hổng bảo mật tuyệt vời

Nmap là một công cụ bảo mật được phát triển bởi Floydor, ban đầu nó chỉ là một tool *nix nhưng về sau đã phát triển rất mạnh mẽ phù hợp với nhiều nền tảng và phát triển cả giao diện UI. Nmap hỗ trợ quét các kiểu quét sau: TCP SYN (half open) scanning TCP FIN Xmas hay NULL (stealth) ...

Tạ Quốc Bảo viết 18:22 ngày 17/09/2018
+4