私はカスタムコンポーネントを作成し、アドミニストレーター内のサブコントローラーの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のドキュメントにない何か他に見当たらない、または追加していないものはありますか?
私にはいくつかのことが起こります。
「管理者」コントローラではなく「サイト」コントローラに送信してもよろしいですか?セッションが異なるため、サイトと管理フォームのトークンは異なります。
POST
経由で送信してもよろしいですか? GET
経由で送信する場合は、JSession::checkToken('get')
を使用してトークンを確認する必要があります
トークンフィールドをフォームタグ内に配置しましたか?ソースを表示して、これがすべて正しく見えることを確認できます。