Мы планируем взаимодействие между php-скриптом и ruby на rails-сервере и наоборот.
Всякий раз, когда я делаю запись данных из PHP-скрипта, на сервере rails выводится уведомление: "Can't verify CSRF token authenticity"
,
Я прохожу authenticity_token
в параметрах поста. Нам нужно как безопасно использовать этот токен на сервере rails.
<?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
Может кто-нибудь сказать нам, как мы можем сохранить наш authenticity_token случайным, согласованным и безопасным между двумя серверами (php и ruby on rails).
Если вы используете контроллер rails в качестве API, защита с помощью токенов CSRF не имеет смысла. Как говорят токены Cross-Site Request Forgery, они предотвращают доступ к вашему приложению из любой точки, кроме представлений, созданных тем же веб-приложением.
Итак, вы должны отключить CSRF в вашем случае и использовать токен аутентификации.
Отвечая на ваш вопрос о том, как безопасно использовать этот токен аутентификации в приложении rails, если у вас есть какое-либо управление пользователями, назначьте токены аутентификации пользователям и найдите пользователя с отправленным токеном, и вы знаете, разрешено ли этому пользователю делать этот запрос. Если у вас нет управления пользователями, создайте таблицу базы данных для маркеров подлинности и проверьте запросы на основе того, что у вас есть в базе данных.
Вы можете написать кастом before_filter
в application_controller и выполнить аутентификацию или авторизацию на основе authenticity_token в запросе.
P.S., если вы беспокоитесь о том, что authenticity_token виден для злоумышленников в сети при отправке запросов, используйте https.
Если приложение Rails используется в качестве сервера API, просто добавьте protect_from_forgery with: :null_session
в соответствующем контроллере.