Я создал приложение, используя 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');
}
}
}
}
Я видел, что это реализовано в другом месте. Прямо сейчас, я изменил имя csrf.key на XSRF-TOKEN, чтобы его подхватили Angular. Не знаете, как проверить, работает ли это. Также не знаете, как получить промежуточное ПО для чтения имени заголовка? – user2530671