■ユーザーズフォーラム リニューアルのお知らせ
新規投稿は新ユーザーズフォーラムにお願いします。

フォーム送信したら「type:csrf」や「type:auth」エラーが出ます。

V.bunny > Re: フォーム送信したら「type:csrf」や「type:auth」エラーが出ます。 @ 2014/12/24 16:14
n1215様

ありがとうございます。
引用:

メソッドがPOSTになっていませんか?

確認しましたが、getになっていました。
しかし、再び正常に動作し始めました。
あまりよくわかりませんがとりあえず解決・・・でしょうか。

引用:
ページ内でBcFormヘルパーないしFormヘルパーを利用し、
正面からCSRFとフォーム改ざんのチェックをパスしたほうが安全です。

関数リファレンスの使い方がやっと理解できたくらいの知識程度で、実装方法がわかりません。
フォーム内容は、アンケートから判定を行うものです。
現在コードをべた書きしている状態です。

もう少し調べてみてみます。
ありがとうございました。

BaserCMS:3.0.6.1
スマートURL:OFF
設置:サブフォルダ
データベース:SQLite3
PHPスキル:E
サーバ:CentOS6.5
PHP:5.3.3

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/19 14:00
すみません、無事に動いていましたが、再び同じエラーが発生するようになりました。

修正したところ
・POST送信をGET送信に変更

ページを作りこもうとして確認のために何度か送受信を繰り返したところ、同じ「type:csrf」や「type:auth」エラーが出るようになりました。
<?php
/*  foreach( $_GET as $key => $value ) {
	echo htmlspecialchars($key) . "=" . htmlspecialchars($value) . "<BR>";
	$_SESSION[$key] = $value;

} */
?>

このコードを書いた後から数回後エラーが出ました。

ソースを正常に動いていた時のものに戻しましたがエラーは改善されません。

サーバキャッシュの削除もやってみましたがエラー内容は変わりませんでした。
sessionを使ったことがいけなかったのでしょうか。
申し訳ありませんが、ご教示下さい。
宜しくお願いします。

BaserCMS:3.0.6.1
スマートURL:OFF
設置:サブフォルダ
データベース:SQLite3
PHPスキル:E
サーバ:CentOS6.5
PHP:5.3.3

V.bunny > Re: フォーム送信したら「type:csrf」や「type:auth」エラーが出ます。 @ 2014/12/19 9:33
n1215様

ありがとうございます。
CSRFは言葉をなんとなく知っているだけでしたのでご説明を拝見し、少しずつ理解できました。
引用:
現在試されているフォームにはそもそもCSRFトークンをhiddenパラメータで埋め込んでいないのでエラーが出ているということですね。

トークンの埋め込み方がわかれば解決・・・ということになるのでしょうか。
難しそうなので、
引用:
* POSTではなくGETやただのaタグによるリンクで実装する(場合によっては意図しない脆弱性を生むかもしれません)

ご教示いただいたうち、こちらで対応しようと思います。

ありがとうございました。

BaserCMS:3.0.6.1
スマートURL:OFF
設置:サブフォルダ
データベース:SQLite3
PHPスキル:E
サーバ:CentOS6.5
PHP:5.3.3

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
<form action="/postworks/confirm" novalidate="novalidate" id="MessageIndexForm" enctype="multipart/form-data" method="post" accept-charset="utf-8">
<div style="display:none;">
<input type="hidden" name="_method" value="POST"/>
<input type="hidden" name="data[_Token][key]" value="ここにCSRFトークンの値" id="Token633941872"/>
</div>
<input type="hidden" name="data[Message][mode]" id="MessageMode"/>

現在試されているフォームにはそもそもCSRFトークンをhiddenパラメータで埋め込んでいないのでエラーが出ているということですね。

・フォームの改ざん防止
同様にCakePHP/baserCMSのフォームのセキュリティに閑する機能として、フォームの入力項目が増減していたり改ざんされて不正なパラメータが入り込んでいないか、
リクエスト元のURLが正当かどうかをチェックする機能があります。
データを入れた際に引っかかっているのはこちらのチェックです。


baserCMSの中でフォームを扱う際にはこれらの仕様を考慮する必要があります。
フォーム設置の目的によりどうするのかが最適かは変わりますが、
対応策としては下記のいずれかになるでしょう。

* 該当のページでCSRF対策・フォーム改ざんチェックを行わないようにbaserCMSのコードを上書きする(基本的に非推奨)
* POSTではなくGETやただのaタグによるリンクで実装する(場合によっては意図しない脆弱性を生むかもしれません)
* baserCMSのメールプラグインで代用する
* CakePHP/baserCMSのセキュリティの仕様に合わせ、Formヘルパーを利用したフォームをプラグインとして追加開発する

Twitter: @n_1215

V.bunny > フォーム送信したら「type:csrf」や「type:auth」エラーが出ます。 @ 2014/12/18 15:29
お世話になります。

固定ページ作成でフォームを作りました。
<form action="./bar" method="post">
・・・・・・
</form>

空データのまま送信を押すと、下記のメッセージが出ました。
引用:
不正なリクエストと判断されました。(type:csrf)CSRF対策によるエラーです。リクエストに含まれるCSRFトークンが不正または無効である可能性があります。

引用:
エラー: The request sent to the address '/aaa/index.php/foo/hoge' was invalid.

&#8226;[internal function] → BcAppController->_blackHoleCallback(string) 
&#8226;CORE/Cake/Controller/Component/SecurityComponent.php line 623 → call_user_func_array(array, array) 
&#8226;CORE/Cake/Controller/Component/SecurityComponent.php line 337 → SecurityComponent->_callback(PagesController, string, array) 
&#8226;CORE/Cake/Controller/Component/SecurityComponent.php line 242 → SecurityComponent->blackHole(PagesController, string) 
&#8226;[internal function] → SecurityComponent->startup(PagesController) 
&#8226;CORE/Cake/Utility/ObjectCollection.php line 128 → call_user_func_array(array, array) 
&#8226;[internal function] → ObjectCollection->trigger(CakeEvent) 
&#8226;CORE/Baser/Event/CakeEventManager.php line 244 → call_user_func(array, CakeEvent) 
&#8226;CORE/Cake/Controller/Controller.php line 675 → CakeEventManager->dispatch(CakeEvent) 
&#8226;CORE/Cake/Routing/Dispatcher.php line 187 → Controller->startupProcess() 
&#8226;CORE/Cake/Routing/Dispatcher.php line 165 → Dispatcher->_invoke(PagesController, CakeRequest) 
&#8226;APP/webroot/index.php line 146 → Dispatcher->dispatch(CakeRequest, CakeResponse) 
&#8226;ROOT/index.php line 53 → require(string) 


また、データをセットした時には下記のようなエラーが出ます。
引用:
不正なリクエストと判断されました。(type:auth)バリデーションエラーまたはコントローラ/アクションの不一致によるエラーです。

フォーム送信はbasercmsではできないのでしょうか。
ご教示願います。

BaserCMS:3.0.6.1
スマートURL:OFF
設置:サブフォルダ
データベース:SQLite3
PHPスキル:E
サーバ:CentOS6.5
PHP:5.3.3

ログイン
ユーザー名:
パスワード:


  新規登録 / パスワード紛失

検索

facebook
フォーラムで悩みが解決した場合など、よかったら「いいね!」をポチっとクリックしてください!質問の回答者や開発者の励みになります

フォーラムガイド


関連リンク

オンライン状況
30 人のユーザが現在オンラインです。 (29 人のユーザが フォーラム を参照しています。)

登録ユーザ: 0
ゲスト: 30