2011-10-02 20 views
6

Estoy trabajando con codeigniter-paypal-ipn y tengo csrf_protection habilitada. Esto parece bloquear el acceso de Paypal a mi controlador IPN. Si desactivo csrf_protection, funciona bien, con csrf_protection habilitada, el servicio de IPN de Paypal arroja un 500 Internal Server Error.Codeigniter: Paypal IPN y csrf_protection

¿Hay alguna manera de solucionar esto sin deshabilitar la protección csrf_? Si no, ¿puedo desactivar la protección csrf solo para ese controlador?

Gracias.

Respuesta

4

Alex, el creador de codeigniter-paypal-ipn aquí. Por el momento, no estoy al tanto de una forma de que la publicación de IPN funcione con csrf_protection habilitada. Si observa cómo lo hace otro lenguaje/marco, p. django-paypal IPN: agregan un CSRF exemption to the specific IPN controller.

Como imm dice, este tipo de control de grano fino no estará disponible en CodeIgniter hasta una versión con this pull request se fusionó (si usted no puede esperar, tratar enfoque caseyamcl 's más adelante, ya que doesn no implica piratear el núcleo de CI ...)

He actualizado el README de mi proyecto para aclarar la situación de CSRF.

+0

Su segundo eslabón se rompe –

12

Sé que la pregunta ha sido respondida, pero lo hice de manera similar sin hackear el núcleo de CI. He añadido lo siguiente a mi archivo/config/config.php aplicación:

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

La matriz puede incluir cualquier ruta que te gusta. El ejemplo anterior se aplicará a cualquier ruta que comience con 'api'.

Entonces, añade el siguiente archivo: aplicación/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

caso Gracias, eso es una adición muy útil! –

+0

funcionó perfectamente para mí, muy, muy útil respuesta –

+0

Lamento toparme pero encontré esta respuesta después de buscar e implementar muchos métodos horribles. Esta es, de lejos, la mejor solución que he visto (¡y no solo para las solicitudes de PayPal!). Excelente y muchas gracias. – twistedpixel

Cuestiones relacionadas