Bonjour tout le monde,je suis entrain de tourner en rond depuis un moment sur la facon d'interdire la modification de l'url appeler en ajax par exemple lors de la suppression d'un commentaire.Je m'explique
J'utilise $.get ('/delete/id',{parametres},function(data){},'json');
maintenant malheureusement ou heureusement,une personne sachant comment fonctionne le systeme d'appel ajax, peut copier l'url appeler dans une nouvelle onglet et procéder par suppression en changeant la valeur de l'id.Je veux empêcher cela mais j'y arrive pas .En resumé c'est un systeme similaire a l'interdiction que @grafikart a fait sur ce site lors de l'appel ajax apres le post d'un commentaire.J'expère avoir été assez clair ^^

11 réponses


Je n'ai rien compris, exprime toi mieux s'il te plait

daemon24
Auteur

En faisant de l'ajax,on utilise une url par exemple http:/locahost/cake/delete/12 pour faire une suppression de l'enregistrement 12.Seulement que, en faisant cet appel,l'url est visible dans la console du navigateur.Ce que je veux c'est que l'url ne soit pas utiliser par une personne mal intentionné pour supprimer manuelement des enregistrements dans ma base de donné en changeant le numeros 12 par ex a 13 pour supprimer l'enregistrement 13 ^^

Ba tu fait une verification en PHP si la l'enregistrement correspond à la session de l'user.

Bonjour

Ce n'est pas l'ajax qui pose problème ici... Quelqu'un qui connaitrait l'url pour supprimer un article peut tjs copier l'url dans un autre onglet.. Il faut faire des vérifications serveurs!!

Via la session si tu l'utilises, c'est une possibilité ou alors via des solutions d'authentificaiton stateless du genre token oauth, saml et j'en passe...

Comme te dit MehdiWEB, il faut confirmer que l'utilisateur en question ait les droits.

prenons un exemple, si moi je peux uniquement supprimer l'article 12, tu ne veux pas que je puisse supprimer les autres articles. Donc lors du script appeler en AJAX tu vas verifier que l'utilisateur qui donne l'action soit bien celui autorisé à le faire. Et c'est avec les sessions que cela va pouvoir se faire car on suppose que l'utilisateur connecté est enregistré en session.

Toujours faire les vérifications en back-end :)

En reflechissant, tu peux si tu ne veux pas de changement de ton url, tu crées des clés je donne un exemple,
pour delete/12 crée une clé aleatoire "xxxxxxxxxxxxxxxxxxxxxx" sauvegardée en base. et tu aurais donc une url delete/12/xxxxxxxxxxxxxxxxxxxxxx. lors du traitement verifier que la base delete/12 correspond bien à sa clé en base. La verification devra avoir lieu en session mais si c'est cela il vaut mieux faire la modification vu avec les posts précédents.

daemon24
Auteur

Le probleme c'est que comme je gère les commentaires(create,read,update,delete) en ajax et surtout lorsque j'utilise le composant security de cakephp,il ne genere un nouveau token qu'apres rechargement de la page alors que moi deja je veux generer de nouvelles clés a chaque post,suppression sans rechargement .Comment y arriver?Par ex si j'utilise le token generé en session, celui ci n'est plus du Tout valable apres la premiere suppression .Quand j'essaie de supprimer une deuxieme enregistrement avec la même clé Eh bien ca marche(alors que ca devrait refuser
Voici mon code javascript


  $('#commentaires').on('click','.del',function(event){
     event.preventDefault();  
     $id = $(this).data('id');
     $token = "<?php echo $this->Session->read('Auth.User.username') ?>"
        if(confirm('Voulez vous vraiment supprimer cet commentaire?')){
        $.get("<?php echo $delete ?>/"+$id+"/"+$token+"",function(data){

          },'json');
          $(this).parent().parent().slideUp();  
        }

  });

Salut je te fais un petit retour car je trouve ton js correct mais effectivement, il y a peut etre un souci avec ton cakephp, mais la désolé je ne connais pas ce framework.

Bonsoir.
Si tu es sur CakePHP, il te suffit de vérifier dans l'action correspondante de ton controller, s'il reçoit une requête en ajax, si ce n'est pas le cas, tu renvoies une erreur d'exception, sinon, tu laisses le traitement de la fonction se continuer.

On peut tester dans php que l'appel vient bien d'ajax :
if (!isset ($_SERVER['HTTP_X_REQUESTED_WITH']) || $_SERVER['HTTP_X_REQUESTED_WITH'] != 'XMLHttpRequest') {
header("location:index.php");
}
ici on renvoit à l'accueil pour un appel qui ne peut être fait qu'en ajax.