3

使用の違いは何ですか:

 $.ajax({
  type: 'POST',
  url: Drupal.settings.basePath + 'module/get/' + node,
  dataType: 'json',
  data: { 'ajax' : true }
 });

対:

 $.ajax({
  type: 'POST',
  url: Drupal.settings.basePath + 'module/get',
  dataType: 'json',
  data: { 'ajax' : true, 'node' : node }
 });

最初のケースでは、ノード変数にコールバック関数のパラメーターとしてアクセスし、2 番目のケースでは $_POST['node'] でアクセスしますよね? 2 番目の方法が常に優れているとは限りませんが、多くの人が最初の方法を行っているのを目にします。2 番目の方法もそれほど安全であるとは言えません。まだフォーム トークンを調べていますが、最初にこの基本的なビットを理解しようとしています。

ケース 1 についても疑問に思います。この ajax がボタンによってトリガーされると仮定すると、人が URL mysite/module/get/20 に直接入力してアクティブ化するのをどのように停止しますか? $_POST['ajax'] == true をチェックするだけでそれを行うことができますか? それともまだセキュリティホールがあるのでしょうか?

4

1 に答える 1

4

一見したところ、実際の違いはありません:

「ノード」変数が単なるノード ID であると仮定すると、2 つの間に大きな違いはありません。意味的には、サーバーの状態を変更せずにデータを取得するだけなので、どちらも「取得」操作を実行しているように見えます (技術的にはリクエストを投稿します)。

セキュリティに関しても、関連する違いはありません。どちらも簡単に「偽造」でき、違いは「標準」の GET と POST の議論と同じになります。それらは URL 内にはっきりと見えるため、カジュアルなオブザーバーにとってはもう少し「アクセスしやすい」ものです。

しかし、Drupal 内の「利便性」の違い:

Drupal 内では、ワイルドカード ローダー引数機能 (Drupal 6 で導入)を利用できるため、最初のバージョンが頻繁に使用されます。コールバック URL が hook_menu で次のように定義されているとします。

$items['module/get/%node'] = array(
'title' => 'Foo',
'type' => MENU_CALLBACK,
'page callback' => 'yourModule_callback',
'page arguments' => array(2),
);

これにより、コールバック関数に渡す前にパラメーターでa を実行するように Drupal に指示するyourModule_callback()ため、渡された nid の完全にロードされたノード オブジェクトである最初のパラメーターで呼び出されます。例の 2 番目のバージョンを使用すると、コールバック関数は、POST データからノード オブジェクトを抽出した後、ノード オブジェクト自体をロードする必要があります。%nodenode_load()

ここで便利なことを。

さらに、Drupal 内の一般的なパターンは、非 JavaScript の「フォールバック」代替と同じコールバック URL を AJAX リクエストに使用することです。したがって、yourModule_callback()が呼び出されると、最初に渡されたノードで意図したことを実行し、基本的にその結果を組み立てることができます。その後$ajax == TRUE、POST データ内のみをチェックします。そこにある場合、結果が AJAX 要求を対象としていることを認識しているため、結果を JSON として出力する可能性があります。そこにない場合は、ページ全体のサイクルが進行していることを認識し、それに応じて出力を調整できます (たとえば、フォームの再構築、ページ全体の再生成など)。

そうすれば、非 AJAX/AJAX コールバック用に別の URL を登録する必要がなくなります。

于 2010-01-27T08:32:49.610 に答える