Не удалось проверить CSRF! в почтальоне при попытке POST-метода (API с Slim 3) - PullRequest
0 голосов
/ 06 мая 2018

Я работаю с проектом Slim 3 и установил пакет CSRF ("slim / csrf": "^ 0.8.2",)

Для отправки запроса POST я использую почтальона. При отправке действия я получаю следующую ошибку:

Неудачная проверка CSRF!

Вот мои маршруты API (в данном случае, сфокусируйтесь на маршруте POST):

<?php

/* RESTful endpoints or routes */

use App\Controllers\api\users\UserController;

    $app->group('/api',function () use ($app){
        $app->group('/users', function () {
            $this->get('', UserController::class.':index');
            $this->get('/{id}', UserController::class.':show');
            $this->post('', UserController::class.':store');
        });
    });

Вот контроллер, который должен получить информацию из запроса POST, где я получаю сообщение об ошибке:

//Save a user via API
    public function store($request,$response,$args)
    {
        //todo: validation!
        var_dump($request->getParams());//todo: CSRF check failed!
        die();
    }

Здесь я зарегистрировал компонент CSRF:

//Register the CSRF Component
$container['csrf'] = function ($container){
    return new \Slim\Csrf\Guard();
};

Я попробовал это решение: https://stackoverflow.com/a/48266488/1883256, но оно не сработало.

Есть ли обходной путь, чтобы заставить его работать? Как запретить запуск CSRF на моих маршрутах API?

* Решено *

Как и предполагал Zamrony P. Juhara , я решил применить CSRF к веб-маршрутам, за исключением маршрутов API.

Группировка всех моих веб-маршрутов:

    $app->group('',function ()use($app,$container){
        /* ******* H O M E ********** */
        require __DIR__ . '/web/home/home.php';
        /* ********** T O P I C  s ********** */
        require __DIR__ . '/web/topics/topics.php';

        /* ********** C O N T A C T *********** */
        require __DIR__ . '/web/contact/contact.php';

/* And so on and etcetera ....*/
        /* ********************************************************************************* */
    })->add($container->get('csrf'));//Adding CSRF protection only for web routes

И, например, внутри файла маршрутов topics.php, который у меня есть:

$app->group('/topics',function(){
    $this->get('',TopicController::class.':index');
    $this->get('/{id}',TopicController::class.':show')->setName('topics.show');
});

А что касается маршрутов API, они остаются теми же.

Наконец, внутри моего контейнера я прокомментировал следующее:

//$app->add($container->get('csrf')); //I've commented this line in order to add CSRF for specific routes (all except APIs ones)

1 Ответ

0 голосов
/ 06 мая 2018

Необходимо убедиться, что вы добавили промежуточное ПО Slim\Csrf\Guard к маршруту или приложению (если вы хотите применить csrf для всех маршрутов). Например

Чтобы применить промежуточное ПО csrf ко всем маршрутам

$csrf = $container->csrf;
$app->add($csrf);

или подать заявку только на определенные маршруты

$csrf = $container->csrf;
$app->group('/api',function () use ($app, $csrf){
    $app->group('/users', function () {
        $this->get('', UserController::class.':index')
             ->add($csrf);
        $this->get('/{id}', UserController::class.':show');
        $this->post('', UserController::class.':store')
             ->add($csrf);
    });
});

Вам также необходимо убедиться, что есть данные имени / значения токена Csrf, переданные с запросом. Когда вы используете Postman, вам нужно найти способ получить пару ключ / значение имени токена перед выполнением POST.

Следующий код является выдержкой из Slim Csrf Readme .

// CSRF token name and value
$nameKey = $this->csrf->getTokenNameKey();
$valueKey = $this->csrf->getTokenValueKey();
$name = $request->getAttribute($nameKey);
$value = $request->getAttribute($valueKey);

// Render HTML form which POSTs to /bar with two hidden input fields for the
// name and value:
// <input type="hidden" name="<?= $nameKey ?>" value="<?= $name ?>">
// <input type="hidden" name="<?= $valueKey ?>" value="<?= $value ?>">

Прочтите Slim Csrf Readme для получения дополнительной информации.

...