시작하기

이 포괄적인 안내서는 웹 애플리케이션에 Shieldon 방화벽을 시작하는 방법에 대한 자세한 개요를 제공합니다. 함께 알아보겠습니다.

서버 요구 사항

Shieldon 방화벽을 사용하기 전에 서버가 다음 요구 사항을 충족하는지 확인하세요:

  • PHP >= 7.1.0
  • Ctype PHP 확장 기능
  • JSON PHP 확장 기능
  • GD PHP 확장 (Captcha 검증 코드 이미지 생성에 필요합니다.)
  • PDO PHP 확장 기능 (MySQL, SQLite 드라이버를 사용하려는 경우에만 필요)
  • Redis PHP 확장 기능 (Redis 드라이버를 사용하려는 경우에만 필요)

설치

Shieldon은 PHP Composer를 통해 설치할 수 있습니다:

composer require shieldon/shieldon

구현 방법

애플리케이션에서 Shieldon을 구현하는 세 가지 기본적인 방법이 있습니다:

  • PSR-15 미들웨어로서 Shieldon을 구현합니다.
  • 애플리케이션의 부트스트랩 단계에서 Shieldon을 구현합니다.
  • 다른 컨트롤러에서 확장하는 부모 컨트롤러에 Shieldon을 구현합니다.

각 구현 방법은 Slim 4, Laravel 6, CodeIgniter 3과 같은 인기 있는 프레임워크를 사용한 실제 예제와 함께 제공됩니다.


PSR-15 미들웨어

예시: Slim 4 프레임워크

Slim 4 프레임워크를 사용한 예제를 보여주는 것처럼 Shieldon을 PSR-15 미들웨어로 사용할 수 있습니다.

(1) 방화벽 미들웨어 생성하기

class FirewallMiddleware
{
    /**
     * 예제 미들웨어 호출 가능한 클래스
     *
     * @param ServerRequest  $request  PSR-7 요청
     * @param RequestHandler $handler  PSR-15 요청 핸들러
     *
     * @return Response
     */
    public function __invoke(Request $request, RequestHandler $handler): Response
    {
        $response = $handler->handle($request);

        $firewall = new \Shieldon\Firewall\Firewall($request, $response);

        // Shieldon 방화벽이 파일을 배치할 디렉토리입니다.
        $firewall->configure(__DIR__ . '/../cache/shieldon_firewall');
        $response = $firewall->run();

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

        return $response;
    }
}

(2) 애플리케이션에 방화벽 미들웨어 추가하기

예를 들어, Slim 4 프레임워크를 사용하는 경우 다음과 같이 코드를 작성해야 합니다.

$app->add(new FirewallMiddleware());

(3) 제어판을 위한 라우트 생성하기

예를 들어, Slim 4 프레임워크를 사용하는 경우 다음과 같이 코드를 작성해야 합니다. 그런 다음 https://yoursite.com/firewall/panel URL을 방문하여 제어판에 로그인할 수 있습니다.

$app->any('/firewall/panel[/{params:.*}]', function (Request $request, Response $response, $args) {
    $firewall = new \Shieldon\Firewall\Firewall($request, $response);

    // Shieldon 방화벽이 파일을 배치할 디렉토리입니다.
    // firewallMiddleware와 동일해야 합니다.
    $firewall->configure(__DIR__ . '/../cache/shieldon_firewall');

    $panel = new \Shieldon\Firewall\Panel();

    // 제어판의 기본 URL입니다.
    $panel->entry('/firewall/panel/');
});

참고:

  • 웹 사이트에 대해 POSTGET HTTP 메소드를 모두 적용해야 합니다.
  • 일시적으로 차단된 사용자가 CAPTCHA를 해결하기 위해 POST 메소드가 필요합니다.

부트스트랩 단계

예시: Laravel 6 프레임워크

Laravel 6 프레임워크를 사용한 예제를 보여주는 것처럼 애플리케이션의 부트스트랩 단계에서 Shieldon을 초기화할 수 있습니다.

(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);
    $response = $firewall->run();

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

(2) 방화벽 제어판을 위한 라우트 정의하기

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

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

    // 진입점은 정의한 라우트와 동일해야 합니다.
    $panel->entry('/firewall/panel/');

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

부모 컨트롤러

예시: CodeIgniter 3 프레임워크

Shieldon을 다른 컨트롤러에서 상속하는 부모 컨트롤러에서 구현할 수도 있습니다. CodeIgniter 3 프레임워크를 사용한 예제를 보여드리겠습니다.

  1. 부모 컨트롤러를 생성합니다.

application/core/ 디렉토리에 MY_Controller.php라는 새 파일을 생성합니다. 이것이 부모 컨트롤러가 됩니다.

다음은 MY_Controller의 기본 구조입니다:

class MY_Controller extends CI_Controller
{
    public function __construct()
    {
        parent::__construct();
    }
}
  1. Firewall 인스턴스를 초기화합니다.

그런 다음, MY_Controller의 생성자에서 Shieldon 방화벽을 초기화합니다. 이렇게 하면 MY_Controller를 상속하는 모든 컨트롤러에서 Shieldon 방화벽이 초기화됩니다.

class MY_Controller extends CI_Controller
{
    public function __construct()
    {
        parent::__construct();

        // Composer 오토로더
        require_once APPPATH . '../vendor/autoload.php';

        // 이 디렉토리는 쓰기 가능해야 합니다.
        $storage = APPPATH . 'cache/shieldon_firewall';

        $firewall = new \Shieldon\Firewall\Firewall();
        $firewall->configure($storage);
        $response = $firewall->run();

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

    /**
     * Shieldon 방화벽 보호.
     */
    public function firewall()
    {
        $firewall = \Shieldon\Container::get('firewall');
        $firewall->run();
    }
}
  1. 제어판을 위한 컨트롤러를 정의합니다.

다음으로, Shieldon 방화벽 제어판을 위한 컨트롤러를 정의해야 합니다. 이 예제에서는 Firewall이라는 이름의 컨트롤러를 만들고 다음 코드를 추가합니다:

class Firewall extends MY_Controller
{
    public function __construct()
    {
        parent::__construct();
    }

    /**
     * 이것이 Shieldon 방화벽 제어판의 진입점입니다.
     */
    public function panel()
    {
        $panel = new \Shieldon\Firewall\Panel();
        $panel->entry('/firewall/panel/');
    }
}

이제, Shieldon 방화벽은 MY_Controller에서 초기화되며, MY_Controller를 상속하는 모든 컨트롤러에서 firewall 메소드를 실행할 수 있습니다. 게다가, Shieldon 방화벽 제어판에 대한 진입점인 Firewall 컨트롤러가 정의되었습니다.

로그인

마지막으로, 선택한 구현 방법과 관계없이 https://yoursite.com/firewall/panel/에 접근하면 로그인 페이지가 표시됩니다.

기본 사용자 이름과 비밀번호는 각각 shieldon_usershieldon_pass입니다. 보안상의 이유로, 첫 로그인 후에 로그인 자격 증명을 변경하는 것을 권장합니다.