Laravel

이 가이드는 Laravel 애플리케이션에 Shieldon 방화벽을 구현하는 데 도움을 줍니다. 다음 단계는 Laravel 5와 6에서 테스트되었습니다.

이 팁들은 유일한 방법이 아니라 몇 가지 아이디어를 제공합니다.

Laravel 프레임워크의 방화벽

설치

PHP Composer를 사용합니다:

composer require shieldon/shieldon

이는 Shieldon에 필요한 종속성도 설치합니다:

  • shieldon/psr-http PSR-7, 15, 17 구현으로 완전한 문서와 포괄적인 테스트가 포함되어 있습니다.
  • shieldon/event-dispatcher 가장 간단한 이벤트 디스패처입니다.
  • shieldon/web-security 웹 보안 관련 기능 모음입니다.
  • shieldon/messenger 텔레그램, 라인, 로켓챗, 슬랙, SendGrid, MailGun 등 타사 API나 서비스로 메시지를 보내기 위한 모듈 모음입니다.

구현

Shieldon을 미들웨어로 사용하거나 웹 애플리케이션의 부트스트랩 단계에서 Shieldon을 구현할 수 있습니다.

부트스트랩 단계

Composer 오토로더를 포함한 이후에 애플리케이션의 부트스트랩 단계에서 Shieldon을 초기화합니다. 이렇게 하면 Laravel의 내장된 기능과의 가능한 충돌을 피할 수 있습니다.

(1) $app 초기화 전

bootstrap/app.php 파일의 <?php 다음에 다음 코드를 추가합니다.

/*
|--------------------------------------------------------------------------
| Shieldon 방화벽 실행
|--------------------------------------------------------------------------
|
| Shieldon 방화벽은 웹사이트로 들어오는 모든 HTTP 요청을 감시합니다.
| Laravel 초기화 전에 Shieldon 방화벽을 실행함으로써 Laravel의 내장된 기능과의 충돌을 피할 수 있습니다.
*/
if (isset($_SERVER['REQUEST_URI'])) {

    // 이 디렉토리는 쓰기 권한이 있어야 합니다.
    // `storage/shieldon_firewall` 디렉토리에 넣습니다.
    $storage =  __DIR__ . '/../storage/shieldon_firewall';

    $firewall = new \Shieldon\Firewall\Firewall();

    $firewall->configure($storage);

    // 제어판의 기본 URL
    $firewall->controlPanel('/firewall/panel/');

    $response = $firewall->run();

    if ($response->getStatusCode() !== 200) {
        $httpResolver = new \Shieldon\Firewall\HttpResolver();
        $httpResolver($response);
    }
}

(2) 방화벽 패널을 위한 Route 정의

routes/web.php 파일에 다음 Route를 추가합니다.

Route::any('/firewall/panel/{path?}', function() {

    $panel = new \Shieldon\Firewall\Panel();
    $panel->csrf(['_token' => csrf_token()]);
    $panel->entry();

})->where('path', '(.*)');

이 방법을 채택하면 Shieldon 방화벽은 전역 범위에서 실행됩니다. 그러나 Shieldon 방화벽이 무시할 URL에 대한 제외 목록을 설정할 수도 있습니다.

미들웨어

사용자 정의 미들웨어를 정의하거나 제공되는 통합 클래스를 사용할 수 있습니다.

통합 클래스를 사용하는 경우 단계 1을 건너뛰고 단계 2-2로 이동하십시오.

1. 미들웨어 정의

다음 명령을 실행하여 ShieldonFirewall이라는 이름의 미들웨어를 생성합니다.

php artisan make:middleware ShieldonFirewall

그런 다음 ShieldonFirewall 미들웨어 클래스의 handle 메서드를 다음 코드로 업데이트합니다.

<?php

namespace App\Http\Middleware;

use Closure;

class ShieldonFirewall
{
    /**
     * 들어오는 요청을 처리합니다.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        $firewall = new \Shieldon\Firewall\Firewall();

        // Shieldon 방화벽이 파일을 배치할 디렉토리입니다.
        $storage = storage_path('shieldon_firewall');;

        $firewall->configure($storage);

        // 제어판의 기본 URL
        $firewall->controlPanel('/firewall/panel/');

        $firewall->getKernel()->setCaptcha(
            new Csrf([
                'name' => '_token',
                'value' => csrf_token(),
            ])
        );

        $response = $firewall->run();

        if ($response->getStatusCode() !== 200) {
            $httpResolver = new \Shieldon\Firewall\HttpResolver();
            $httpResolver($response);
        }

        return $next($request);
    }
}

2. 미들웨어 별칭 등록

app/Http/Kernel.php 파일을 업데이트하고 $routeMiddleware 속성에 다음 줄을 추가합니다.

단계 2-1의 경우:

'firewall' => \App\Http\Middleware\ShieldonFirewall::class,

단계 2-2의 경우 (통합 클래스 사용):

통합 클래스를 사용하는 경우 코드는 다음과 같습니다:

'firewall' => \Shieldon\Firewall\Integration\Laravel::class,

3. 방화벽 패널을 위한 Route 정의

routes/web.php 파일에 다음 Route를 추가합니다.

Route::any('/firewall/panel/{path?}', function() {

    $panel = new \Shieldon\Firewall\Panel();
    $panel->csrf(['_token' => csrf_token()]);
    $panel->entry();

})->where('path', '(.*)');

Shieldon 방화벽은 Daemon 설정 섹션에서 활성화된 경우 웹사이트를 모니터링하기 시작합니다. 설정을 올바르게 설정했는지 확인하십시오.