1. 程式人生 > >Unable to verify your data submission.加入了_csrf也報400錯誤的解決

Unable to verify your data submission.加入了_csrf也報400錯誤的解決

需要 pos 簡單 配置文件 ken 驗證 中文 查看 數據

<input type="hidden" name="_csrf" value="<?=Yii::$app->request->csrfToken?>" />
如果你添加了以上標簽還是報錯那麽你需要堅持看完這篇文檔

剛開始做Yii2開發的程序猿基本上都遇到過這個錯誤,因為在程序設計中避免不了的要向服務器提交數據,那就需要使用到表單。
其實這個錯誤的提示很明確的其中文錯誤就是提交的數據驗證不通過。我們下來分析導致這個錯誤的原因。 導致了這個錯誤的原因是Yii2框架本身的安全機制需要在提交表單時驗證CSRF,為了防止CSRF攻擊,這對於數據的安全性和防止表單的重復提交時很好也是很簡單的一種解決方案。

下邊是常規的解決方案:

1.在form標簽中添加<input type="hidden" name="_csrf" value="<?=Yii::$app->request->csrfToken?>" />

2.在控制器開始部分添加public $enableCsrfValidation = false;

相信第二種方法一定能夠解決問題,但是不安全。你關了CSRF後相當於少了一層安全機制。但是使用第一種方法添加了隱藏標簽不一定能夠成功,這是為什麽呢?讓我們仔細分析。

一、yii2框架如何獲取CSRF進行驗證

我們再方法中並沒有手動接受CSRF的值進行驗證,那麽這一部分是由框架自己來完成的,框架自己來完成就會面臨一個問題。你在回傳CSRF時對於這個值保存在什麽變量中就需要有個統一的約定,不然你傳入的是name="_csrf"但是框架接收時是$_POST[‘csrf-token‘](舉例而已)那麽框架永遠接收不到你的值也就沒有辦法驗證通過。

而這一部分是由yii2中的request來完成的。

二、如何約定CSRF的變量名

我們知道CSRF驗證是由request組件來完成的,而且我們知道yii2的組件都是可以單獨配置的,那麽我們打開配置文件。

‘components‘ => [
    ‘request‘ => [
        ‘csrfParam‘ => ‘_csrf-frontend‘,
    ],

在配置文件中如果有request的配置那麽我們就可以配置CSRF的變量名了例如在我的程序中配置的變量名是_csrf-frontend那麽在添加form隱藏標簽時就需要和這兒的配置一致

三、如何解決

打開APP中的配置文件查看request配置中的‘csrfParam‘ => ‘_csrf-frontend‘,在視圖中的隱藏input的name應該和csrfParam設置的值相同。

如果csrfParam設置的值為_csrf_frontend那麽你的input隱藏標簽需要這樣寫:

<input name="_csrf-frontend" type="hidden" value="<?= Yii::$app->request->csrfToken ?>"/>

Unable to verify your data submission.加入了_csrf也報400錯誤的解決