フォーム送信したら「type:csrf」や「type:auth」エラーが出ます。
V.bunny > フォーム送信したら「type:csrf」や「type:auth」エラーが出ます。 @ 2014/12/18 15:29 |
---|
お世話になります。
固定ページ作成でフォームを作りました。
空データのまま送信を押すと、下記のメッセージが出ました。 引用: 不正なリクエストと判断されました。(type:csrf)CSRF対策によるエラーです。リクエストに含まれるCSRFトークンが不正または無効である可能性があります。 引用: エラー: The request sent to the address '/aaa/index.php/foo/hoge' was invalid.
また、データをセットした時には下記のようなエラーが出ます。 引用: 不正なリクエストと判断されました。(type:auth)バリデーションエラーまたはコントローラ/アクションの不一致によるエラーです。 フォーム送信はbasercmsではできないのでしょうか。 ご教示願います。 BaserCMS:3.0.6.1 |
n1215 > Re: フォーム送信したら「type:csrf」や「type:auth」エラーが出ます。 @ 2014/12/18 19:00 |
---|
V.bunny 様
baserCMSの管轄にあるページに対し、フォームによるHTTPリクエストを行った場合、 デフォルトではセキュリティに関するチェックが行われる仕様になっています。 ・CSRF対策 攻撃用の外部Webページから利用者の意図しないHTTPリクエストを送るCSRF(クロスサイトリクエストフォージェリ)攻撃への対策として、 多くのWebアプリケーションフレームワークでCSRFトークンというランダムな値を利用する仕組みが実装されています。 サーバでHTMLを生成した際にCSRFトークンをformのhiddenパラメータ等として仕込んでおき、 フォームデータの送信時にこのトークンをサーバ側で再び確認することで、不正なリクエストを防ぐというものです。 CakePHP/baserCMSでもこの仕組が実装されており、メールプラグインはこの仕様に合わせて実装されています。 例えば公式サイトの事例掲載申込ページのフォームのソースを見ていただければ、このようになっています。 http://basercms.net/postworks/index
現在試されているフォームにはそもそもCSRFトークンをhiddenパラメータで埋め込んでいないのでエラーが出ているということですね。 ・フォームの改ざん防止 同様にCakePHP/baserCMSのフォームのセキュリティに閑する機能として、フォームの入力項目が増減していたり改ざんされて不正なパラメータが入り込んでいないか、 リクエスト元のURLが正当かどうかをチェックする機能があります。 データを入れた際に引っかかっているのはこちらのチェックです。 baserCMSの中でフォームを扱う際にはこれらの仕様を考慮する必要があります。 フォーム設置の目的によりどうするのかが最適かは変わりますが、 対応策としては下記のいずれかになるでしょう。 * 該当のページでCSRF対策・フォーム改ざんチェックを行わないようにbaserCMSのコードを上書きする(基本的に非推奨) * POSTではなくGETやただのaタグによるリンクで実装する(場合によっては意図しない脆弱性を生むかもしれません) * baserCMSのメールプラグインで代用する * CakePHP/baserCMSのセキュリティの仕様に合わせ、Formヘルパーを利用したフォームをプラグインとして追加開発する Twitter: @n_1215 |
V.bunny > Re: フォーム送信したら「type:csrf」や「type:auth」エラーが出ます。 @ 2014/12/19 9:33 |
---|
n1215様
ありがとうございます。 CSRFは言葉をなんとなく知っているだけでしたのでご説明を拝見し、少しずつ理解できました。 引用: 現在試されているフォームにはそもそもCSRFトークンをhiddenパラメータで埋め込んでいないのでエラーが出ているということですね。 トークンの埋め込み方がわかれば解決・・・ということになるのでしょうか。 難しそうなので、 引用: * POSTではなくGETやただのaタグによるリンクで実装する(場合によっては意図しない脆弱性を生むかもしれません) ご教示いただいたうち、こちらで対応しようと思います。 ありがとうございました。 BaserCMS:3.0.6.1 |
V.bunny > Re: フォーム送信したら「type:csrf」や「type:auth」エラーが出ます。 @ 2014/12/19 14:00 |
---|
すみません、無事に動いていましたが、再び同じエラーが発生するようになりました。
修正したところ ・POST送信をGET送信に変更 ページを作りこもうとして確認のために何度か送受信を繰り返したところ、同じ「type:csrf」や「type:auth」エラーが出るようになりました。
このコードを書いた後から数回後エラーが出ました。 ソースを正常に動いていた時のものに戻しましたがエラーは改善されません。 サーバキャッシュの削除もやってみましたがエラー内容は変わりませんでした。 sessionを使ったことがいけなかったのでしょうか。 申し訳ありませんが、ご教示下さい。 宜しくお願いします。 BaserCMS:3.0.6.1 |
n1215 > Re: フォーム送信したら「type:csrf」や「type:auth」エラーが出ます。 @ 2014/12/19 17:53 |
---|
V.bunny 様
●エラーの内容について CakePHPのSecurityComponentの仕様では、HTTPリクエストのメソッドがPOSTかPUTであるときのみ、 CSRFチェックがなされるはずなのでおかしいですね。 下記が該当コードです。GETの場合、$isPostはfalseになり、チェックはスルーされるはずです。 https://github.com/baserproject/basercms/blob/dev-3/lib/Cake/Controller/Component/SecurityComponent.php#L237-L244 メソッドがPOSTになっていませんか? ●GETとPOSTの使い分けについて また、フォーム設置の目的により最適な方針は変わると書きましたが、 Sessionのデータを書き換えるなどサーバのリソースを変更するならば 原則としてGETの利用は避けたほうがいいと思います。 GETによってリクエストされるのは冪等かつ安全な操作であるべきとされています。 * 冪等…… 何度行っても結果が同じという意味 * 安全…… サーバ上のリソースへの副作用がない=リソースの状態を変更しないという意味 何度行っても結果が同じということで、多くのブラウザは特段の指示がない限りはレスポンスをキャッシュします。 一方、POSTは 冪等でない かつ 安全でない 操作になります。 ブラウザはHTTP POSTの結果をキャッシュしません。 ●セキュリティについて いろいろと作り込むということであればプラグインを作るまではいかずとも、 ページ内でBcFormヘルパーないしFormヘルパーを利用し、 正面からCSRFとフォーム改ざんのチェックをパスしたほうが安全です。 Twitter: @n_1215 |
V.bunny > Re: フォーム送信したら「type:csrf」や「type:auth」エラーが出ます。 @ 2014/12/24 16:14 |
---|
n1215様
ありがとうございます。 引用:
確認しましたが、getになっていました。 しかし、再び正常に動作し始めました。 あまりよくわかりませんがとりあえず解決・・・でしょうか。 引用: ページ内でBcFormヘルパーないしFormヘルパーを利用し、 関数リファレンスの使い方がやっと理解できたくらいの知識程度で、実装方法がわかりません。 フォーム内容は、アンケートから判定を行うものです。 現在コードをべた書きしている状態です。 もう少し調べてみてみます。 ありがとうございました。 BaserCMS:3.0.6.1 |