2011-10-02 15 views
6

Sto lavorando con codeigniter-paypal-ipn e ho abilitato csrf_protection. Questo sembra bloccare l'accesso da Paypal al mio controller IPN. Se disattivo csrf_protection funziona perfettamente, con csrf_protection abilitato, il servizio IPN di paypal genera un errore interno di 500 server.Codeigniter: Paypal IPN e csrf_protection

C'è un modo per risolvere questo senza disabilitare csrf_protection? In caso contrario, posso disabilitare csrf_protection solo per quel controller?

Grazie.

risposta

4

Alex il creatore di codeigniter-paypal-ipn qui. Al momento non sono a conoscenza di un modo per far funzionare il post IPN con csrf_protection abilitato. Se osservi come funziona un'altra lingua/framework, ad es. django-paypal IPN: aggiungono uno CSRF exemption to the specific IPN controller.

Come imm dice, questo tipo di controllo a grana fine, non sarà disponibile in CodeIgniter fino ad una versione con this pull request è fusa (se non potete aspettare, provare approccio 's caseyamcl sotto come doesn 't coinvolgono nucleo CI hacking ...)

ho aggiornato di README il mio progetto per rendere la situazione più chiara CSRF.

+0

Il secondo collegamento è rotto –

12

So che la domanda è stata risolta, ma l'ho fatto in modo simile senza l'hacking del nucleo della CI. Ho aggiunto il seguente al mio file/config/config.php applicazione:

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

L'array può includere tutti i percorsi che ti piace. L'esempio sopra si applicherà a tutti i percorsi che iniziano con 'API'.

Poi, ho aggiunto il seguente file: 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

Grazie caso, questo è un'aggiunta molto utile! –

+0

ha funzionato perfettamente per me, molto molto utile risposta –

+0

Mi dispiace scontrarsi ma ho trovato questa risposta dopo aver cercato e implementato molti metodi orribili. Questa è di gran lunga la soluzione migliore che abbia mai visto (e non solo per le richieste di PayPal!). Eccellente e molte grazie. – twistedpixel

Problemi correlati