2017-01-09 32 views
0

Я создал приложение, используя Slim 2 некоторое время назад, и я пытаюсь добавить Angular. Пока все идет хорошо, но я больше не могу использовать защиту CSRF, которую я использую, поскольку Angular обрабатывает все мои запросы на почту. Ниже находится предшествующее промежуточное программное обеспечение, с которым я работал.Добавление Углового XSRF в Slim приложение - Это звук?

<?php 

namespace Cache\Middleware; 

use Exception; 
use Slim\Middleware; 

class CsrfMiddleware extends Middleware { 
protected $key; 

public function call() { 

    $this->key = $this->app->config->get('csrf.key'); 

    $this->app->hook('slim.before', [$this, 'check']); 

    $this->next->call(); 
} 

public function check() { 
    if (!isset($_SESSION[$this->key])) { 
     $_SESSION[$this->key] = $this->app->hash->hash($this->app->randomlib->generateString(128)); 
    } 

    $token = $_SESSION[$this->key]; 

    if (in_array($this->app->request()->getMethod(), ['POST', 'PUT', 'DELETE'])) { 
     $submittedToken = $this->app->request()->post($this->key) ?: ''; 

     if (!$this->app->hash->hashCheck($token, $submittedToken)) { 
      throw new Exception('CSRF token mismatch'); 
     } 
    } 

    $this->app->view()->appendData([ 
     'csrf_key' => $this->key, 
     'csrf_token' => $token 
    ]); 
} 

}

Я знаю, что угловой автоматически ищет знак с именем XSRF-ЗНАК и добавляет его в заголовок, как X-XSRF-токен. Как изменить промежуточное программное обеспечение ниже, чтобы писать, читать и сравнивать правильные значения.

EDIT:

После глядя на это снова и проверить тонкую документацию, я изменил строку:

$submittedToken = $this->app->request()->post($this->key) ?: ''; 

к этому:

$submittedToken = $this->app->request->headers->get('X-XSRF-TOKEN') ?: ''; 

Если я прав , это присваивает $ submittedToken значение, переданное как X-XSRF-TOKEN в заголовке. Это бросает исключение с сообщением от промежуточного программного обеспечения «несоответствие токен CSRF». Это похоже на прогресс. Ниже приводится соответствующая Угловая:

app.controller('itemsCtrl', ['$scope', '$http', function($scope, $http) { 

    // Initailize object when the page first loads 
    $scope.getAll = function() { 
     $http.post('/domain.com/admin/getNames').success(function(data) { 
      $scope.names = data; 
     }); 
    } 

EDIT

Ниже, где код PHP стоит сейчас. Я думаю, что это работает. Я получил ожидаемую ошибку CSRF, когда я удаляю cookie или изменяю значение $ token перед отправкой формы. Меня немного беспокоит, что произойдет, когда у меня будет много пользователей. Я еще не тестировал его. Основываясь на этом пересмотре, защита кажется явной?

<?php 

namespace Cache\Middleware; 

use Exception; 
use Slim\Middleware; 

class CsrfMiddleware extends Middleware { 
protected $key; 

public function call() { 

    $this->key = $this->app->config->get('csrf.key'); 

    $this->app->hook('slim.before', [$this, 'check']); 

    $this->next->call(); 
} 

public function check() { 
    // if (!isset($_SESSION[$this->key])) { 
    if (!isset($_SESSION[$this->key])) { 
     // $_SESSION[$this->key] = $this->app->hash->hash($this->app->randomlib->generateString(128)); 
     $this->app->setcookie($this->key, $this->app->hash->hash($this->app->randomlib->generateString(128))); 
    } 

    // $token = $_SESSION[$this->key]; 
    if(isset($_COOKIE[$this->key])) { 
     $token = $_COOKIE[$this->key]; 
    } 

    if (in_array($this->app->request()->getMethod(), ['POST', 'PUT', 'DELETE'])) { 
     // $submittedToken = $this->app->request()->post($this->key) ?: ''; 
     $submittedToken = $this->app->request->headers->get('X-XSRF-TOKEN') ?: ''; 

     if (!$this->app->hash->hashCheck($token, $submittedToken)) { 
      throw new Exception('CSRF token mismatch'); 
     } 
    } 
} 
} 

ответ

0

Из Angular docs for $http Cross Site Request Forgery (XSRF) Protection:

Название заголовков могут быть заданы с помощью свойств xsrfHeaderName и xsrfCookieName либо $ httpProvider.defaults в конфигурации времени, $ http.defaults во время выполнения, или объект конфигурации для запроса.

Чтобы изменить их, чтобы использовать другое имя/название файла cookie, измените эти значения.

+0

Я видел, что это реализовано в другом месте. Прямо сейчас, я изменил имя csrf.key на XSRF-TOKEN, чтобы его подхватили Angular. Не знаете, как проверить, работает ли это. Также не знаете, как получить промежуточное ПО для чтения имени заголовка? – user2530671