1. 程式人生 > 其它 >thinkphp自己寫一個csrf驗證中介軟體

thinkphp自己寫一個csrf驗證中介軟體

<?php
declare (strict_types=1);

namespace app\middleware;


class Csrf
{

    public function handle($request, \Closure $next)
    {


        //過濾掉不需要csrf驗證的請求
        if (in_array($request->method(), ['GET', 'HEAD', 'OPTIONS'], true)) {
            return $next($request);
        }

        $name = '_token';
        $csrf_token = session($name);
        $token = $request->has($name) ? $request->param($name) : $request->header('X-CSRF-TOKEN');
        if ($csrf_token === null || $csrf_token !== $token) {
            if ($request->isAjax()) {

                //表單驗證外掛formValidation適配(暫留,以後會慢慢移除)
                if ($request->has('_remote') && $request->param('_remote') == 'formValidation') {
                    return ok(['valid' => false, 'message' => "頁面長時間未活動,已經失效,請重新整理重試~"]);
                }

                //表單驗證外掛formValidation
                if ($request->has('_remote') && $request->param('_remote') == 'formValidation2') {
                    return json(['valid' => false, 'message' => "頁面長時間未活動,已經失效,請重新整理重試~"]);
                }


                return fail("頁面長時間未活動,已經失效,請重新整理重試~");
            } else {
                return redirect($request->server('HTTP_REFERER'))->with('error', '頁面長時間未活動,已經失效,請重試~');
            }
        }
        return $next($request);
    }

}

使用

在路由中介軟體中新增即可