web-dev-qa-db-ja.com

カスタムコンポーネント管理でトークンチェックが機能しない

私はカスタムコンポーネントを作成し、アドミニストレーター内のサブコントローラーのdefault.phpビューで異なるタスクを実行する3つのフォームを用意しました。私のtmplビュー__default.php_内で、各フォームには<?php echo JHtml::_('form.token'); ?>があり、値が1のトークンを名前として非表示フィールドをレンダリングします。サブコントローラーJSession::checkToken() or dieトークンが有効かどうかを判断します。

問題は、POSTを介してフォームを送信するときに、POSTトークンを含むデータと、トークンをチェックする関数JSession::checkToken()が一致しないため、FALSE。JSessionクラスをデバッグした後、トークンを取得すると、投稿されたトークンと同じではないことがわかりました。Googleを検索しましたが、機能する解決策を見つけることができました。

CSRFに関するJoomlaのドキュメント によると、<?php echo JHtml::_('form.token'); ?>を追加し、コントローラーにチェックを追加するのと同じくらい簡単であると想定されていますJSession::checkToken() or die

2つのトークンがPOSTおよびJSessionクラスの形式とどのように異なるのですか?Joomlaのドキュメントにない何か他に見当たらない、または追加していないものはありますか?

2
RNickMcCandless

私にはいくつかのことが起こります。

「管理者」コントローラではなく「サイト」コントローラに送信してもよろしいですか?セッションが異なるため、サイトと管理フォームのトークンは異なります。

POST経由で送信してもよろしいですか? GET経由で送信する場合は、JSession::checkToken('get')を使用してトークンを確認する必要があります

トークンフィールドをフォームタグ内に配置しましたか?ソースを表示して、これがすべて正しく見えることを確認できます。

3
user101289