2011-10-02 3 views
6

Je travaille avec codeigniter-paypal-ipn et ai activé csrf_protection. Cela semble bloquer l'accès de Paypal à mon contrôleur IPN. Si je désactive csrf_protection, cela fonctionne très bien, avec csrf_protection activé, le service IPN de paypal génère une erreur interne de 500 serveurs.Codeigniter: Paypal IPN et csrf_protection

Y at-il un moyen de résoudre ce problème sans désactiver la protection csrf? Si non, puis-je désactiver la protection csrf juste pour ce contrôleur?

Merci.

Répondre

4

Alex le créateur de codeigniter-paypal-ipn ici. Pour le moment je ne suis pas au courant d'un moyen de faire fonctionner le post IPN avec csrf_protection activé. Si vous regardez la façon dont un autre langage/cadre le fait, par ex. django-paypal IPN - ils ajoutent un CSRF exemption to the specific IPN controller.

Comme imm dit, ce type de contrôle fin ne sera pas disponible dans CodeIgniter jusqu'à une version avec this pull request est fusionnée (si vous ne pouvez pas attendre, essayez approche de caseyamcl ci-dessous comme il doesn n'implique pas le piratage du noyau CI ...)

J'ai mis à jour le README de mon projet pour rendre la situation CSRF plus claire.

+0

Votre deuxième lien est rompu –

12

Je sais que la question a été répondue, mais je l'ai fait d'une manière similaire sans pirater le noyau CI. J'ajouté ce qui suit à mon application/config/config.php:

$config['csrf_ignore'] = array('api'); 

Le tableau peut inclure tous les chemins que vous aimez. L'exemple ci-dessus s'applique à tous les chemins commençant par 'api'.

Ensuite, j'ai ajouté le fichier suivant: application/core/MY_Input.php:

<?php if (! defined('BASEPATH')) exit('No direct script access allowed'); 

class MY_Input extends CI_Input 
{ 
    function _sanitize_globals() 
    { 
     $ignore_csrf = config_item('csrf_ignore'); 

     if (is_array($ignore_csrf) && count($ignore_csrf)) 
     { 
      global $URI; 
      $haystack = $URI->uri_string(); 

      foreach($ignore_csrf as $needle) 
      { 
       if (strlen($haystack) >= strlen($needle) && substr($haystack, 0, strlen($needle)) == $needle) 
       { 
        $this->_enable_csrf = FALSE; 
        break; 
       } 
      }   
     } 

     parent::_sanitize_globals(); 
    } 
} 
/* EOF: MY_Input */ 
+0

Merci cas, c'est un ajout très utile! –

+0

a parfaitement fonctionné pour moi, très très utile réponse –

+0

Désolé de bosse mais je suis tombé sur cette réponse après la recherche et la mise en œuvre de nombreuses méthodes horribles. C'est de loin la meilleure solution que j'ai vu (et pas seulement pour les demandes PayPal!). Excellent et merci beaucoup. – twistedpixel