thinkphp自己寫一個csrf驗證中介軟體
阿新 • • 發佈:2021-11-18
<?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); } }
使用
在路由中介軟體中新增即可