2010-01-27 5 views
3

param Quelle est la différence entre l'utilisation:Drupal Ajax: Passing valeurs par url vs données

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

contre:

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

Dans le premier cas, vous auriez accès à la variable node en tant que paramètre dans la fonction de rappel et dans le second cas, vous y accèderiez avec $ _POST ['node'] right? La seconde méthode ne serait-elle pas toujours meilleure, mais je vois beaucoup de gens le faire en premier. Pour ne pas dire que la deuxième voie est aussi sécurisée. Toujours à la recherche de jetons de forme, mais en essayant de comprendre ce bit de base en premier.

En vous posant la question 1, en supposant que cet ajax soit déclenché par un bouton, comment empêcher une personne d'entrer directement dans l'url, mysite/module/get/20 et l'activer? Est-ce que vérifier simplement que $ _POST ['ajax'] == vrai fait cela? Ou y a-t-il encore un trou de sécurité là-bas?

+0

Pouvez-vous expliquer pourquoi vous pensez que la deuxième méthode serait toujours meilleure? – marcvangend

+0

Je pensais que ce serait un "petit" meilleur car il n'expose pas les paramètres dans l'URL. Maintenant, je vois comment les deux façons sont utiles. – Wade

Répondre

4

Pas de différence réelle à première vue:

En supposant que votre variable « noeud » est juste un identifiant de nœud, il n'y a pas beaucoup de différence entre les deux. Sémantiquement, les deux semblent effectuer une opération 'get' (même si elles sont techniquement des demandes de post), car ils récupèrent simplement des données sans changer d'état sur le serveur (ok, c'est une autre hypothèse). En ce qui concerne la sécurité, il n'y a pas non plus de différence significative - les deux peuvent être facilement forgés et la différence se résume à celle du débat GET vs. POST «standard», c'est-à-dire, aucune différence si ce n'est la première. expose les paramètres un peu plus «accessible» à l'observateur occasionnel, car ils sont visibles dans l'URL.

Mais une différence de « commodité » dans Drupal:

Dans Drupal, la première version est souvent rencontrée car il peut utiliser la fonctionnalité Wildcard Loader Arguments (introduite dans Drupal 6). Disons que votre URL de rappel est définie dans hook_menu comme ceci:

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

Avec cela, yourModule_callback() sera appelée avec son premier paramètre étant déjà le noeud complètement chargé obect pour le passé dans JNV, comme %node dit Drupal pour exécuter une node_load() sur le paramètre avant de le remettre à la fonction de rappel. En utilisant la deuxième version de votre exemple, la fonction de rappel devrait charger l'objet nœud lui-même, après l'avoir extrait des données POST.

Donc, une chose de commodité ici. En outre, un modèle courant dans Drupal consiste à utiliser la même URL de rappel pour une requête AJAX que pour son alternative de remplacement non javascript. Ainsi, lorsque yourModule_callback() est invoqué, il peut tout d'abord faire ce qu'il a l'intention de faire avec le noeud passé, en assemblant son résultat.Après cela est fait, il vérifie seulement $ajax == TRUE dans les données POST. Si c'est le cas, il sait que le résultat est destiné à une requête AJAX, il peut donc afficher le résultat sous forme de JSON. Si ce n'est pas le cas, il sait qu'un cycle de pleine page est en cours, et peut ajuster sa sortie en conséquence (par exemple reconstruire un formulaire, régénérer une page entière, peu importe ...). De cette façon, vous n'avez pas besoin d'enregistrer des URL séparées pour vos rappels non AJAX/AJAX.

+0

Merci d'expliquer la différence entre les deux en détail. :) Je vois comment les deux façons peuvent être utiles maintenant. La façon dont mon formulaire fonctionne est qu'il est généralement destiné à ajax, mais si js est désactivé, il se repliera sur l'envoi du formulaire avec le formulaire api. – Wade

+0

Je me demande toujours s'il est infaillible de vérifier simplement si $ ajax == TRUE dans mon rappel pour déterminer si quelqu'un ne va pas simplement à l'url au lieu d'utiliser le formulaire. Par exemple, à l'origine vous allez dans "mysite/module/get/20" et vous déclenchez le callback (ce que je ne veux pas faire), mais si vous retournez le callback en vérifiant si $ ajax == true vous pouvez empêcher cela . Alors que l'url ne déclenchera plus le rappel, et ne peut pas non plus utiliser quelque chose comme mysite/module/get/20 & ajax = true pour déclencher le rappel? Y a-t-il encore des façons délicates de contourner cela, ou devrait-elle être sécuritaire? Merci. – Wade

+0

Ce ne serait pas «infaillible». Cela ne ferait que confirmer que 'ajax = true' vous a été envoyé, mais pas que ce post provenait réellement de votre formulaire. (Ainsi, seulement empêcher l'accès «facile» via un GET standard). Pour vous assurer que le message lui-même provient du formulaire, vous devez utiliser la logique de traitement formsAPI pour reconstruire le formulaire et vérifier le formulaire Token. Cela ressemble à une surcharge pour un simple rappel AJAX - pourquoi êtes-vous inquiet que quelqu'un puisse obtenir les données sans provenir du formulaire? (Si un utilisateur peut accéder au formulaire, ha peut obtenir la réponse AJAX de toute façon) –