主页/PHP笔记/PHP问答/框架Laravel/如何在Laravel中禁用或启用CSRF保护

如何在Laravel中禁用或启用CSRF保护

Bug编译狮

Bug编译狮

在Laravel中,CSRF(跨站请求伪造)保护是防止恶意用户通过伪造请求来访问受保护的资源的一种机制。默认情况下,Laravel会自动启用CSRF保护。然而,有时你可能需要禁用或启用这个保护。

禁用CSRF保护

如果你希望在某些特定条件下禁用CSRF保护,可以在控制器中使用$csrfProtection属性。以下是一个示例:

namespace AppHttpControllers;

use IlluminateFoundationBusDispatchesRequests;
use IlluminateRoutingController as BaseController;
use IlluminateFoundationValidationValidatesRequests;

class ExampleController extends BaseController
{
    use DispatchesRequests, ValidatesRequests;

    /**
     * Disable CSRF protection for this controller.
     *
     * @return void
     */
    public function __construct()
    {
        $this->middleware('web');
        $this->middleware('disable-csrf-protection'); // 自定义中间件
    }

    /**
     * Example method to demonstrate CSRF protection being disabled.
     *
     * @return IlluminateHttpResponse
     */
    public function disableCsrfExample()
    {
        return view('example.disable_csrf');
    }
}

在这个示例中,我们创建了一个自定义的中间件disable-csrf-protection,并在构造函数中将其应用到所有路由上。

启用CSRF保护

如果你想在某些特定条件下启用CSRF保护,可以使用$csrfProtection属性并设置为false。以下是一个示例:

namespace AppHttpControllers;

use IlluminateFoundationBusDispatchesRequests;
use IlluminateRoutingController as BaseController;
use IlluminateFoundationValidationValidatesRequests;

class ExampleController extends BaseController
{
    use DispatchesRequests, ValidatesRequests;

    /**
     * Enable CSRF protection for this controller.
     *
     * @return void
     */
    public function __construct()
    {
        $this->middleware('web');
        $this->middleware('enable-csrf-protection'); // 自定义中间件
    }

    /**
     * Example method to demonstrate CSRF protection being enabled.
     *
     * @return IlluminateHttpResponse
     */
    public function enableCsrfExample()
    {
        return view('example.enable_csrf');
    }
}

在这个示例中,我们创建了一个自定义的中间件enable-csrf-protection,并在构造函数中将其应用到所有路由上。

示例代码相关步骤

  1. 创建自定义中间件

    php artisan make:middleware DisableCsrfProtection
  2. 编辑中间件文件: 打开 app/Http/Middleware/DisableCsrfProtection.php 文件,并添加以下代码:

    namespace AppHttpMiddleware;
    
    use Closure;
    
    class DisableCsrfProtection
    {
       public function handle($request, Closure $next)
       {
           // 这里可以添加一些逻辑来决定是否禁用CSRF保护
           // 例如,根据当前环境或用户身份进行判断
           if (/* 条件 */) {
               $request->headers->remove('X-CSRF-TOKEN');
           }
    
           return $next($request);
       }
    }
  3. 注册中间件: 在 app/Http/Kernel.php 文件中注册这个中间件:

    protected $routeMiddleware = [
       'auth' => AppHttpMiddlewareAuthenticate::class,
       'can' => AppHttpMiddlewareCan::class,
       'guest' => AppHttpMiddlewareRedirectIfAuthenticated::class,
       'csrf' => AppHttpMiddlewareVerifyCsrfToken::class,
       'disable-csrf-protection' => AppHttpMiddlewareDisableCsrfProtection::class,
       'enable-csrf-protection' => AppHttpMiddlewareEnableCsrfProtection::class,
    ];
  4. 应用中间件: 在控制器中使用这个中间件:

    namespace AppHttpControllers;
    
    use IlluminateFoundationBusDispatchesRequests;
    use IlluminateRoutingController as BaseController;
    use IlluminateFoundationValidationValidatesRequests;
    
    class ExampleController extends BaseController
    {
       use DispatchesRequests, ValidatesRequests;
    
       /**
        * Disable CSRF protection for this controller.
        *
        * @return void
        */
       public function __construct()
       {
           $this->middleware('web');
           $this->middleware('disable-csrf-protection'); // 自定义中间件
       }
    
       /**
        * Example method to demonstrate CSRF protection being disabled.
        *
        * @return IlluminateHttpResponse
        */
       public function disableCsrfExample()
       {
           return view('example.disable_csrf');
       }
    }

通过这些步骤,你可以灵活地控制Laravel应用程序中的CSRF保护。

黑板Bug讲师

黑板Bug讲师

介绍

跨站请求伪造(CSRF)是一种常见于web应用程序的安全漏洞。Laravel,一个流行的PHP框架,默认包含CSRF保护以确保应用程序的安全性。然而,在某些情况下,开发人员可能需要选择性地禁用或启用CSRF保护。在本教程中,我们将探索如何在Laravel应用程序中进行此类操作,包括从基本到高级的代码示例。

理解 Laravel 中的 CSRF 保护

Laravel 包含自动检查每个 POST、PUT、PATCH 或 DELETE 请求中的 CSRF 令牌的中间件。这个令牌确保请求来自同一个应用,防止未经授权的操作。这个中间件全局应用于所有请求,但 Laravel 也提供了管理其行为的方法。

<!-- Example of a CSRF field in a Laravel form -->
 <form method="POST" action="{{ route('example.route') }}">
     @csrf
     <!-- Other form fields -->
 </form>

在Laravel中禁用CSRF保护。

要禁用CSRF保护,您可以修改。VerifyCsrfToken中间件。从基本的路由排除开始,编辑配置文件。$exceptproperty.

namespace AppHttpMiddleware;

use IlluminateFoundationHttpMiddlewareVerifyCsrfToken as Middleware;

class VerifyCsrfToken extends Middleware
{
    protected $except = [
        'route/to/exclude',
        'another/route/to/exclude',
    ];
}

在这一配置下,指定的路由。$except数组不会检查CSRF令牌。

为API路由禁用CSRF保护

API通常使用令牌进行身份验证,不需要CSRF保护。你可以通过应用中间件来按组配置你的API路由,从而禁用CSRF检查。

// In your routes file (e.g., web.php or api.php)
Route::group(['middleware' => ['api']], function () {
    // Your API routes
});

// In the RouteServiceProvider class
protected function mapApiRoutes()
{
    Route::prefix('api')
        ->middleware('api')
        ->namespace($this->namespace)
        ->group(base_path('routes/api.php'));
}

在特定的路由上启用CSRF保护。

如果你已经全局禁用了CSRF保护,可能需要为某些路由重新启用它。这相对较少见,但可以通过应用以下代码来实现:web中间件。

Route::post('protected/route', function () {
     // Route logic
 })->middleware('web');

通过应用web在该路由上添加中间件时,您已包含CSRF保护。

正在测试CSRF保护措施。

在修改CSRF保护设置时,非常重要的是要彻底测试它们。以下是如何为一个受CSRF保护的路由编写功能测试的示例。

public function disable_test_route_without_middleware()
 {
     $response = $this->withoutMiddleware()->post('/route/to/test', []);
     $response->assertStatus(200);
 }

该测试确认,不应用CSRF中间件的情况下,路线是可访问的。

结论

在本教程中,我们介绍了如何启用和禁用Laravel应用中的CSRF保护措施。正如您所学习的那样,管理CSRF保护对于确保您的应用程序的安全性和灵活性至关重要。请记住,在更改任何CSRF设置后要彻底测试以确保您的应用程序仍然安全。

长工码奴1523

长工码奴1523

在 Laravel 中,你可以通过以下两种方式来启用和禁用 CSRF 保护:

  1. 启用 CSRF 保护

    config/app.php 文件的 csrf_protection 属性设置为 false

return [
    // ...
    'csrf_protection' => false,
];

这将使应用程序完全不受 CSRF 的保护。

  1. 禁用 CSRF 保护

    如果你想暂时禁用 CSRF 保护,可以使用以下方法:

    • 使用 protected_methods() 方法:如果你正在处理 HTTP 请求,并且希望阻止 CSRF 被检测到,可以通过 protected_methods() 方法添加自定义的方法名。
public function protectedMethods()
{
    return ['authenticate'];
}
  • 使用 csrf_field()csrf_token() 方法:这些方法会生成一个用于验证请求是否为恶意攻击者的字段和令牌。当用户尝试提交表单时,这些字段会被自动填充,并且服务器会检查它们是否与令牌匹配。
// 检查请求是否是恶意攻击者
if (! $this->request->isCsrf()) {
    abort(403);
}

$token = csrf_token();

echo '<input type="hidden" name="_token" value="' . $token . '">';

// 如果提交的数据没有 token,则显示错误消息并返回 403 错误。
if ($this->request->session()->has('_token')) {
    echo '<div class="alert alert-danger">Invalid CSRF Token!</div>';
    return redirect('/')->with('error', 'Invalid CSRF Token!');
}

以上就是在 Laravel 中禁用或启用 CSRF 保护的方法。根据你的需求选择合适的方式即可。