> PHP 프레임워크 > Laravel > Laravel에서 CSRF(교차 사이트 요청 위조) 보호를 위해 미들웨어를 사용하는 방법

Laravel에서 CSRF(교차 사이트 요청 위조) 보호를 위해 미들웨어를 사용하는 방법

PHPz
풀어 주다: 2023-11-02 11:16:47
원래의
726명이 탐색했습니다.

Laravel에서 CSRF(교차 사이트 요청 위조) 보호를 위해 미들웨어를 사용하는 방법

최신 웹 애플리케이션에서는 CSRF(교차 사이트 요청 위조) 공격이 일반적인 공격 방법이 되었습니다. Laravel은 CSRF 보호 메커니즘이 내장된 인기 있는 PHP 프레임워크로 CSRF 추가를 사용하는 것이 매우 편리할 수 있습니다. 애플리케이션을 보호합니다.

이 글에서는 Laravel에서 CSRF 보호를 위해 미들웨어를 사용하는 방법을 소개하고 구체적인 코드 예제를 제공합니다.

CSRF(교차 사이트 요청 위조) 공격이란 무엇입니까?

Cross-Site Request Forgery 공격은 영어로 Cross-Site Request Forgery, 줄여서 CSRF라고도 알려져 있으며 사용자 ID를 위조하여 악의적인 요청을 시작하는 공격 방법입니다.

공격자는 일반적으로 사용자가 악성 링크가 있는 페이지를 클릭하도록 속이거나 피해자가 로그인한 웹 사이트에 악성 스크립트를 삽입하여 CSRF 공격을 구현합니다. 피해자가 로그인하면 공격자는 일련의 악의적인 요청(예: 비밀번호 변경, 메시지 게시 등)을 시작합니다. 이러한 요청은 피해자에게 합법적인 것처럼 보이지만 실제로는 이러한 요청이 공격자에 의해 시작됩니다. 피해자에게 특정 해를 끼칠 것입니다.

Laravel에서 CSRF 보호를 위해 미들웨어를 사용하는 방법은 무엇입니까?

Laravel은 CSRF 공격으로부터 애플리케이션을 보호할 수 있는 매우 편리한 메커니즘을 제공합니다. Laravel 프레임워크에는 미들웨어를 통해 구현할 수 있는 CSRF 보호 메커니즘이 내장되어 있습니다.

Laravel에서는 CSRF 미들웨어를 사용하여 POST, PUT, DELETE 요청 시 CSRF 토큰이 유효한지 확인합니다. 기본적으로 Laravel은 애플리케이션에 VerifyCsrfToken 미들웨어를 추가하고 이러한 요청에 대한 CSRF 토큰이 유효한지 자동으로 확인합니다. VerifyCsrfToken中间件,并自动检查这些请求的CSRF令牌是否有效。

如果CSRF令牌无效,Laravel将抛出一个TokenMismatchException异常,并提供一个默认的错误视图。我们也可以根据自己的需求自定义错误处理方式。

配置CSRF令牌

Laravel会在每个用户会话中为应用生成一个CSRF令牌,我们可以在应用config/csrf.php的配置文件中调整CSRF令牌的配置。该配置文件允许您配置CSRF COOKIE和CSRF令牌在请求中的名称。

<?php

return [

    /*
    |--------------------------------------------------------------------------
    | CSRF Cookie Name
    |--------------------------------------------------------------------------
    |
    | The name of the cookie used to store the CSRF token.
    |
    */

    'cookie' => 'XSRF-TOKEN',

    /*
    |--------------------------------------------------------------------------
    | CSRF Header Name
    |--------------------------------------------------------------------------
    |
    | The name of the CSRF header used to store the CSRF token.
    |
    */

    'header' => 'X-XSRF-TOKEN',

    /*
    |--------------------------------------------------------------------------
    | CSRF Token Expiration
    |--------------------------------------------------------------------------
    |
    | The number of minutes that the CSRF token should be considered valid.
    |
    */

    'expire' => 60,

];
로그인 후 복사

使用CSRF中间件

Laravel中的VerifyCsrfToken中间件将检查在路由中定义的任何POST、PUT或DELETE请求上的CSRF令牌是否有效。默认情况下,应用的routes/web.php文件除了web中间件外,还会使用VerifyCsrfToken中间件。

可以在中间件组中添加CSRF中间件,以便在应用中的其他路由中使用。为了使用中间件保护路由,我们可以使用middleware方法将其添加到路由定义中,如下所示:

Route::middleware(['web', 'csrf'])->group(function () {
    //
});
로그인 후 복사

自定义CSRF错误处理

默认情况下,如果使用VerifyCsrfToken中间件检测到CSRF令牌不正确,Laravel将抛出一个TokenMismatchException异常,并提供一个默认的错误视图。

我们可以在app/Exceptions/Handler.php文件中尝试捕获CSRF异常并指定我们自己的错误处理方式。下面是一个自定义CSRF异常处理程序的示例:

<?php

namespace AppExceptions;

use Exception;
use IlluminateFoundationExceptionsHandler as ExceptionHandler;
use IlluminateSessionTokenMismatchException;

class Handler extends ExceptionHandler
{
    /**
     * A list of the exception types that should be reported.
     *
     * @var array
     */
    protected $dontReport = [
        TokenMismatchException::class,
    ];

    /**
     * Report or log an exception.
     *
     * @param  Exception  $exception
     * @return void
     *
     * @throws Exception
     */
    public function report(Exception $exception)
    {
        parent::report($exception);
    }

    /**
     * Render an exception into an HTTP response.
     *
     * @param  IlluminateHttpRequest  $request
     * @param  Exception  $exception
     * @return IlluminateHttpResponse
     *
     * @throws Exception
     */
    public function render($request, Exception $exception)
    {
        if ($exception instanceof TokenMismatchException) {
            // 处理CSRF异常
            return redirect()
                ->back()
                ->withInput($request->input())
                ->with('error', 'CSRF Token Mismatch');
        }

        return parent::render($request, $exception);
    }

}
로그인 후 복사

在上面的代码中,我们捕获了TokenMismatchException异常,并使用with方法将错误消息保存到error闪存数据中。稍后,我们可以在视图中使用with方法访问这个闪存数据。

最后,我们可以在视图中为任何需要提交POST、PUT或DELETE请求的表单添加CSRF令牌字段。使用csrf_field方法即可在表单中生成CSRF令牌字段,如下所示:

<form method="POST" action="/example">
    {{ csrf_field() }}

    <!-- Your form fields go here... -->

    <button type="submit">Submit</button>
</form>
로그인 후 복사

总结

在本文中,我们介绍了如何在Laravel中使用中间件保护应用免受CSRF攻击。我们通过配置CSRF令牌、使用默认的VerifyCsrfToken

CSRF 토큰이 유효하지 않은 경우 Laravel은 TokenMismatchException 예외를 발생시키고 기본 오류 보기를 제공합니다. 또한 필요에 따라 오류 처리를 사용자 정의할 수도 있습니다. 🎜

CSRF 토큰 구성

🎜Laravel은 각 사용자 세션에서 애플리케이션에 대한 CSRF 토큰을 생성하며, 이는 애플리케이션 config/csrf.php 구성의 구성 파일에서 조정할 수 있습니다. CSRF 토큰. 이 구성 파일을 사용하면 요청에서 CSRF COOKIE와 CSRF 토큰 이름을 구성할 수 있습니다. 🎜rrreee

CSRF 미들웨어 사용

🎜Laravel의 VerifyCsrfToken 미들웨어는 경로에 정의된 모든 POST, PUT 또는 DELETE 요청에서 CSRF 토큰이 유효한지 여부를 확인합니다. 기본적으로 애플리케이션의 routes/web.php 파일은 web 미들웨어 외에 VerifyCsrfToken 미들웨어도 사용합니다. 🎜🎜 CSRF 미들웨어는 미들웨어 그룹에 추가되어 애플리케이션의 다른 경로에서 사용할 수 있습니다. 미들웨어로 경로를 보호하려면 다음과 같이 middleware 메서드를 사용하여 경로 정의에 이를 추가할 수 있습니다. 🎜rrreee

Custom CSRF 오류 처리

🎜기본적으로, 잘못된 CSRF 토큰이 VerifyCsrfToken 미들웨어를 사용하여 감지되면 Laravel은 TokenMismatchException 예외를 발생시키고 기본 오류 보기를 제공합니다. 🎜🎜우리는 app/Exceptions/Handler.php 파일에서 CSRF 예외를 포착하고 자체 오류 처리를 지정할 수 있습니다. 다음은 사용자 정의 CSRF 예외 처리기의 예입니다. 🎜rrreee🎜 위 코드에서 TokenMismatchException 예외를 포착하고 with 메서드를 사용하여 오류 메시지를 오류가 있습니다. 나중에 with 메소드를 사용하여 뷰에서 이 플래시 데이터에 액세스할 수 있습니다. 🎜🎜마지막으로 POST, PUT 또는 DELETE 요청을 제출해야 하는 모든 양식의 뷰에 CSRF 토큰 필드를 추가할 수 있습니다. 아래와 같이 csrf_field 메소드를 사용하여 양식에 CSRF 토큰 필드를 생성할 수 있습니다: 🎜rrreee🎜 요약 🎜🎜 이 기사에서는 Laravel 공격에서 미들웨어를 사용하여 CSRF로부터 애플리케이션을 보호하는 방법을 다루었습니다. CSRF 토큰을 구성하고, 기본 VerifyCsrfToken 미들웨어를 사용하고, CSRF 오류 처리 방법을 사용자 정의하여 애플리케이션 보안을 효과적으로 개선했습니다. 저는 이러한 기술이 보다 안전한 웹 애플리케이션을 구축하는 데 도움이 될 수 있다고 믿습니다. 🎜

위 내용은 Laravel에서 CSRF(교차 사이트 요청 위조) 보호를 위해 미들웨어를 사용하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿