8
votes

Prévenir le formulaire de formulaire de formulaires Drupal "Get"

Drupal insère un formulaire_Token comme champ masqué lorsqu'il fait des formulaires. La form_Token est ensuite vérifiée sur la soumission de formulaire pour empêcher les attaques de falsification de la demande croisée. Les données de formulaire qui sont soumises sont garanties d'origine du formulaire original rendu par Drupal.

Cependant, les formulaires utilisant la méthode "get" ne devraient pas avoir besoin de ce jeton. Tout ce qu'il fait est allongé et injuste l'URL résultante.

Y a-t-il un moyen de le supprimer?


1 commentaires

Voici un article qui arrive à décrire pourquoi il s'agit d'une idée incroyablement mauvaise. pixelJets.com/blog/csrf-avoid-security-holes- Votre-Drupal-pour MS


4 Réponses :


13
votes

Oui, il y a un moyen, mais utilisez-le consciemment (voir avertissement ci-dessous): em>

Si vous créez le formulaire vous-même, ajoutez P>

// Example for removal of token validation from login (NOTE: BAD IDEA!)
function yourmodule_form_alter(&$form, &$form_state, $form_id) {
  if ($form_id == 'user_login_block') {
    unset($form['#token']);
  }
}


4 commentaires

La principale différence entre Get and Post est que, selon la spécification HTTP, Get est censé être "sûr". Cela signifie que les attaques XSRF ne sont pas autant de problèmes - trompant le navigateur d'un utilisateur dans la création d'une demande d'obtention ne doit pas entraîner de changement d'état sur le serveur. C'est pourquoi je pense que le formulaire_Token est superflu.


C'est vrai - en théorie :) Les mots importants ici sont "censés être" et "ne devrait pas". La différence n'est qu'une suggestion / une meilleure pratique, mais rien ne vous empêche de vous arrêter ou d'autres développeurs d'utiliser obtenir des demandes de choses «dangereuses» et cela est fait assez souvent hors de commodité, car un lien simple est mis en œuvre plus rapidement et plus léger que celui d'une forme . Mais bien sûr, si vous savez que ce que votre get est inoffensif, supprimez le jeton - je voulais juste étirer le point qui obtient n'est pas «intrinsèquement» sans danger et que la suppression de la manutention de jeton devrait être une décision consciente et ne se produisait pas automatiquement.


Cela dit, je pense que j'ai étiré ce point un peu à de loin donné votre question - j'ai édité la réponse en conséquence, désolé d'avoir été un peu trop à la mer;)


Je n'avais pas vraiment précisé dans la question. Merci pour votre explication et pour avoir raffiné votre réponse.



4
votes

Le site que je travaille sur utilise l'API de formulaire DRUPAL 6 pour les formulaires de recherche personnalisés, alors en supprimant le jeton et en enregistrant ID, nous avons pu mettre en cache les résultats dans MemCache. Maintenant, nous avons déménagé à Acquia hébergement, c'est mis en cache à l'aide de vernis.

Pour supprimer le formulaire_Token and form_build_id de votre formulaire et soumettez-la sous forme de demande d'obtention, utilisez la méthode suivante: P>

<?php

function module_example_form($form_state, $form_id = NULL) {
  // Form root settings.
  $form = array();

  // Set the submission callback for this form. 
  $form['#submit'][] = __FUNCTION__ . '_submit';

  // Set the request method for this form to GET instead of the default
  // of POST.
  $form['#method'] = 'get';

  // Remove unique form token so request can be cached. This is accompanied by
  // code in hook_form_alter to ignore the token and remove the build_id.
  $form['#token'] = FALSE;

  // Submit button.
  $form['go'] = array(
    '#type' => 'submit',
    '#value' => t('Go!'),
  );

  return $form;
}

/**
 * Implements hook_form_alter().
 */
function module_form_alter(&$form, $form_state, $form_id) {
  // Changes to the 'module_example_form' form.
  if ($form_id == 'module_example_form') {
    // Unset the hidden token field and form_build_id field.
    unset($form['#token'], $form['form_build_id'], $form['#build_id']);
  }
}

?>


0 commentaires

9
votes

Cela a fonctionné pour moi. Je devais non définir tous les éléments de l'API de formulaire et définir la propriété #Token sur FALSE. Notez la fonction After_build pour désétablir les autres propriétés.

   function mymodule_form(&$form_state){
      $form['name'] = array(
        '#type'   => 'textfield',
        '#title'  => 'name',
        '#value'  => 'name', 
      );
      $form['#method'] = 'get';
      $form['#action'] = url('someurl');
      $form['submit'] = array('#type' => 'submit', '#value' => 'go');
      $form['#token'] = false;
      $form['#after_build'] = array('mymodule_unset_default_form_elements');
      return $form;
    }

    function mymodule_unset_default_form_elements($form){
      unset($form['#build_id'], $form['form_build_id'], $form['form_id']);
      return $form;
    }


1 commentaires

Merci, travaille bien pour moi. Si vous souhaitez supprimer le OP = qui est livré avec le soumettre, il suffit d'ajouter '# attributs' => Array ('Nom' => '') à votre matrice de soumission.



4
votes

Je trouve que je découvre simplement que le jeton CSRF est pas une option. Nous avons résolu-le en utilisant hameçon_theme_registry_alter () à écrase le noyau drupal theme_Choriden () fonction de sorte que l'élément de forme caché 'form_token' est rendu comme une étiquette . La balise provoquera un vernis pour apporter un appel à un fichier PHP que nous permettons de passer dans le cache. Ce fichier calculera le jeton de formulaire approprié pour l'utilisateur actuel et émettra ensuite le code HTML pour le champ masqué. Vous pouvez calculer ce jeton sans une bootstrap Drupal, mais vous sera Besoin d'une seule requête DB pour récupérer le * drupal_private_key * pour votre site, qui est stocké dans le table variable table.


0 commentaires