2015-08-31 12 views
7

Stiamo pianificando l'interazione tra lo script php in ruby ​​sul server di rails e viceversa.Richiesta - Risposta dal server php al server ruby ​​on rails. Emissione di un token CSRF

Ogni volta che faccio arricciare i dati di post da script php, sul display di notifica del server di rotaie - "Can't verify CSRF token authenticity".

Sto passando authenticity_token in parametri di post. Abbiamo bisogno di come utilizzare questo token in modo sicuro sul server di rails. Codice

<?php 

    class active_merchant{  
     private $endpoint_url;  // server address or url where data is to be posted. 
     private $params;   // form fields 
     private $fields_count;  // count of fields in credit card 

     public function __construct(){ 

      $this->endpoint_url = "http://localhost:8080/activemerchant/index"; 
      $token = md5('random'); 
      $this->params = array('name'=>'test','authenticity_token'=>$token); 

     } 

     /* function curl_post 
      makes a curl post to the end point url 
      global variables 
      */ 

     public function curl_post(){ 

      try{ 

       $ch = curl_init(); 
       curl_setopt($ch, CURLOPT_URL, $this->endpoint_url); 
       curl_setopt($ch, CURLOPT_POST, 1); 
       curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($this->params)); 
       curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
       curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json')); 
       $response = curl_exec($ch); 

       print_r($response); 
       //return $response; 

      }catch(Exception $e){ 
       throw new Exception($e->getMessage(),$e->getCode(),$e->gtLine()); 
      } 

     } 

    } 

    $active_merchant = new active_merchant(); 
    $active_merchant->curl_post();  
?>  

Rails -

class ActivemerchantController < ApplicationController 
protect_from_forgery except: :index 
    def index 
    Rails.logger.debug params.inspect 
    puts params.inspect 
    self.response_body = "Hello, world!" 
    end 
end 

Qualcuno può dirci come possiamo mantenere la nostra authenticity_token casuale, coerente e sicuro tra due server (PHP e Ruby on Rails).

+0

Considererei una route API separata che non utilizza un 'authenticity_token', ma utilizza invece un altro meccanismo per garantire che solo i server autorizzati possano utilizzare quell'api. – spickermann

+1

Il token CSRF è per richiesta, quindi se un server PHP ha fatto un cURL per ottenerlo, sarebbe sbagliato. Puoi disabilitare temporaneamente il controllo CSRF sull'app Rails e provare a eseguire – Ashish

+0

@Ashish - Sì, disabilitare CSRF sull'app per rails funziona, ma non sarebbe sicuro dato che chiunque può pubblicare dati sul server ruby ​​su quel metodo –

risposta

1

Se si utilizza il controller delle guide come API, la protezione con i token CSRF non ha senso. Come dicono i token denominati "Cross-Site Request Forgery", impediscono l'accesso alla tua app da qualsiasi posizione diversa dalle visualizzazioni generate dalla stessa web app.

Pertanto, è necessario disabilitare CSRF nel proprio caso e utilizzare il token di autenticità.

Rispondere alla domanda su come utilizzare in modo sicuro questo token di autenticità sull'app per rails, se si dispone di una gestione utente, assegnare token di autenticazione agli utenti e trovare l'utente con un token inviato e sapere se tale utente è autorizzato a effettuare tale richiesta . Se non si dispone di una gestione utenti, creare una tabella di database per i token di autenticazione e convalidare le richieste in base a ciò che si ha nel database.

È possibile scrivere un before_filter personalizzato in application_controller ed eseguire l'autenticazione o l'autorizzazione in base all'autenticity_token nella richiesta.

P.S, se si è preoccupati che il segno di autenticità sia visibile agli autori di attacchi nella rete durante l'invio di richieste, utilizzare https.

0

Se l'app Rails viene utilizzata come server API, aggiungere semplicemente protect_from_forgery with: :null_session nel controller appropriato.