カスタムJoomlaコンポーネントを構築していて、これをテンプレート(default.php)ファイルのフォームに追加しました(HTTP POSTを使用しています)。
echo JHTML::_( 'form.token' ); //add hidden token field to prevent CSRF vulnerability
次に、コントローラーのトークンを次のようにチェックします。
JRequest::checkToken() or die( 'Invalid Token' );
しかし、私が何をしても、無効なトークンを取得します。HTMLページでソースを表示すると、フォームにトークン付きの非表示タイプが作成されることを確認しました。また、コントローラーで、トークンの値が同じであることを確認しました。
print_r(JUtility::getToken());
では、トークンが同じ値である場合、なぜそれが無効なトークンメッセージで終了するのでしょうか。
編集:私が言及しなかった重要な部分があります。私のフォームは、view.html.phpに追加された別のjsファイルでjqueryajaxを使用して処理されます。ajaxPOSTは次のようになります。
jQuery.ajax({
type: 'POST',
url: 'index.php?option=com_recordings&task=deletevideos&format=raw',
data: {checkedarray:checked},
success: function(data){
//delete row
}
});
コントローラはこれを処理します:
function deletevideos()
{
$video_list = JRequest::getVar('checkedarray', 0, 'post', 'array');
//print_r(JUtility::getToken());
JRequest::checkToken() or jexit( 'Invalid Token' );
$model = &$this->getModel();
return $model->setDeleteVideos($video_list);
}
次に、これはDB更新を行うモデルに移動します。関連するかもしれないこの古い投稿を見ました。トークンを生成する方法/場所、およびそのトークンを検証する場所/方法が明確ではありません。私の場合は必要ないと思うユーザーに対してもチェックするので、この投稿はかなり複雑に見えます。それとも私は誤解していますか?
編集#2
さて、トークンが欠落しているので、jsファイルに渡す必要があります。だから私はこれを私のview.html.phpに追加できると思いました:
$addtoken = JUtility::getToken();
$addtokenjs = 'jQuery(function() {
var token="'.$addtoken.'";
});';
$doc->addScriptDeclaration( $addtokenjs );
$doc->addScript(JURI::base()."components/com_recordings/js/recordings.js");
どうやらaddScriptDeclarationはrecordings.jsファイルの前に何も置かないので、これをドキュメントレディ関数に入れる必要があります。次に、トークンをajax
呼び出しに渡します。
jQuery.ajax({
type: 'POST',
url: 'index.php?option=com_recordings&task=deletevideos&format=raw'+token+'=1',
data: {checkedarray:checked},
success: function(data){
//delete row
}
});
どうやら私はこのエラーが発生するので、これを正しく行っていません:ReferenceError: token is not defined
。