formKeyValidator = $formKeyValidator; $this->redirectFactory = $redirectFactory; $this->appState = $appState; } /** * @param HttpRequest $request * @param ActionInterface $action * * @return bool */ private function validateRequest( HttpRequest $request, ActionInterface $action ): bool { $valid = null; if ($action instanceof CsrfAwareActionInterface) { $valid = $action->validateForCsrf($request); } if ($valid === null) { $valid = !$request->isPost() || $request->isAjax() || $this->formKeyValidator->validate($request); } return $valid; } /** * @param HttpRequest $request * @param ActionInterface $action * * @return InvalidRequestException */ private function createException( HttpRequest $request, ActionInterface $action ): InvalidRequestException { $exception = null; if ($action instanceof CsrfAwareActionInterface) { $exception = $action->createCsrfValidationException($request); } if (!$exception) { $response = $this->redirectFactory->create() ->setRefererOrBaseUrl() ->setHttpResponseCode(302); $messages = [ new Phrase('Invalid Form Key. Please refresh the page.'), ]; $exception = new InvalidRequestException($response, $messages); } return $exception; } /** * @inheritDoc */ public function validate( RequestInterface $request, ActionInterface $action ): void { try { $areaCode = $this->appState->getAreaCode(); } catch (LocalizedException $exception) { $areaCode = null; } if ($request instanceof HttpRequest && in_array( $areaCode, [Area::AREA_FRONTEND, Area::AREA_ADMINHTML], true ) ) { $valid = $this->validateRequest($request, $action); if (!$valid) { throw $this->createException($request, $action); } } } }