2

カスタム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

4

5 に答える 5

4

ajax リクエストでトークン値を渡しているようには見えません。そのため、このエラーが発生しています。

あなたはできる - 1)このようにURLにトークンを追加する

url: 'index.php?option=com_recordings&task=deletevideos&format=raw&'. JUtility::getToken() .'=1'

2) または、Serializeを使用してフォーム全体を送信します。

EDIT 2:- このように getToken という関数を作成できます-

 $addtokenjs = 'function getToken() {
                    var token="'.$addtoken.'";
                    return token;
                    };';

そして、呼び出す代わりにURLで呼び出すtokenことができますgetToken()

url: 'index.php?option=com_recordings&task=deletevideos&format=raw'+getToken()+'=1'

これがうまくいくことを願っています。

于 2013-01-21T07:01:09.160 に答える
2

使ってみて

JSession::checkToken() or die( JText::_( 'Invalid Token' ) );

JRequest ではなく。私が JSession をより気に入っている理由は、JRequest が非推奨になることを考える必要なく、Joomla 2.5/3.0 との互換性が保証されているからです。Joomla 2.5 では関数は JRequest を使用し、3.0 では JInput を使用します。


編集

AJAX の場合、実際にはPOST. あなたのデータは現在checkedarray:checked、AJAXリクエストのトークンではなく、チェックされたデータになります。メソッドを使用する場合は、serialize でデータを渡す必要がありますPOST。ただし、シリアル化するとデータが URL に配置されることに注意してください。次に、このトークンを次のように処理できます

// Check for request forgeries using one of either JRequest of JSession
JRequest::checkToken( 'get' ) or jexit( 'Invalid Token' );
//Alternative
JSession::checkToken( 'get' ) or jexit( 'Invalid Token' );

完全を期すために、指定したリンクは GET メソッドを使用しています。AJAX 関数の 3 行目でわかるように、彼はユーザー名 (彼の場合) と URL のトークンを渡されます。

function check_username(username, token) {
  var url = 'index.php?option=com_user&task=check_user';
  data = 'username=' + username + '&' + token;     //TOKEN INSERTED INTO URL HERE
 $.ajax({
  type: "GET",
  url: url,
  data: data,
  success: function(xml) {
    var result = $(xml).find('response').text();
    if (result == 'found') {
       alert( 'Please select a different username, ' + username + ' already exists' );
   }
   }
  }); // ajax
}

この後は、次を使用して処理するのは簡単です

// Check for request forgeries using one of either JRequest of JSession
JRequest::checkToken( 'get' ) or jexit( 'Invalid Token' );
//Alternative
JSession::checkToken( 'get' ) or jexit( 'Invalid Token' );

いずれにせよ、それはおそらくあなたのモデルにいくつかの微調整を伴うでしょう - あなたが複数の変数を渡って渡すように - それは難しいことではありません. お役に立てれば!

于 2013-01-21T01:34:51.917 に答える
1

フォームデータが次のように送信された場合$_GET

JRequest::checkToken('get') or jexit( 'Invalid Token' );;

フォームデータが次のように送信された場合$_POST

JRequest::checkToken('post') or jexit( 'Invalid Token' );;

それ以外の場合は、以下を使用できます。

JRequest::checkToken('request') or jexit( 'Invalid Token' );

続きを読む

于 2013-01-19T11:22:13.447 に答える
1

初期コードの明らかな問題は、トークンをコントローラーに渡していないことです。

data: {checkedarray:checked}おそらく、削除したい ID の配列だけが含まれています。

Irfan バージョンは実装が最も簡単で、動作するはずです。私はそれを機能させることができました。

ここに作業コードの要点があります(これは本番用のコードではなく、トークンの問題をテストするためのものであることに注意してください)。しかし、私はそれをテストしましたが、私にとってはうまくいきます。

于 2013-01-21T19:34:27.867 に答える
1

将来の使用の場合に備えて: Joomla で! 3.xJUtility::getToken()は に置き換えられましたJSession::getFormToken()

ここを参照してください: http://api.joomla.org/cms-3/classes/JSession.html#method_getFormToken

于 2014-02-04T23:59:46.013 に答える