【发布时间】:2015-09-23 01:16:06
【问题描述】:
在两个地方我发现可以通过设置protected $except 变量来绕过 Laravel csrf 保护。但它似乎没有根据文档工作:
http://laravel.com/docs/5.1/billing#handling-stripe-webhooks
在
http://laravel.com/docs/5.1/routing#csrf-protection
protected $except = [
'stripe/*',
];
我正在使用 5.1
在 routes.php 中
Route::match(['post'], '/webhooks/provider/callback/{version}', [
'as' => 'provider.webhooks.callback', 'uses' => 'WebhookController@callback'
]);
Route::match(['post'], '/webhooks/provider/fallback/{version}', [
'as' => 'provider.webhooks.fallback', 'uses' => 'WebhookController@fallback'
]);
这里是
<?php namespace App\Http\Middleware;
use Closure;
use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as BaseVerifier;
class VerifyCsrfToken extends BaseVerifier {
protected $except = [
'webhooks/*',
'/webhooks/*',
];
public function handle($request, Closure $next)
{
return parent::handle($request, $next);
}
}
这是BaseVerifier 中我没有看到任何$except 检查的内容:
<?php namespace Illuminate\Foundation\Http\Middleware;
use Closure;
use Illuminate\Contracts\Routing\Middleware;
use Symfony\Component\HttpFoundation\Cookie;
use Illuminate\Contracts\Encryption\Encrypter;
use Illuminate\Session\TokenMismatchException;
use Symfony\Component\Security\Core\Util\StringUtils;
class VerifyCsrfToken implements Middleware {
public function handle($request, Closure $next)
{
if ($this->isReading($request) || $this->tokensMatch($request))
{
return $this->addCookieToResponse($request, $next($request));
}
throw new TokenMismatchException;
}
}
但是我已经通过注释解决了,但仍然按照文档设置 $except 应该已经工作了;不是吗?:
<?php namespace App\Http;
use Illuminate\Foundation\Http\Kernel as HttpKernel;
class Kernel extends HttpKernel {
protected $middleware = [
//'App\Http\Middleware\VerifyCsrfToken',
];
}
这是在错误日志中:
[2015-07-06 09:40:34] production.ERROR: exception 'Illuminate\Session\TokenMismatchException' in /vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/VerifyCsrfToken.php:46
Stack trace:
#0 /app/Http/Middleware/VerifyCsrfToken.php(26): Illuminate\Foundation\Http\Middleware\VerifyCsrfToken->handle(Object(Illuminate\Http\Request), Object(Closure))
#1 /vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(125): App\Http\Middleware\VerifyCsrfToken->handle(Object(Illuminate\Http\Request), Object(Closure))
【问题讨论】:
-
您可以发布您的路线文件吗?您是否将路由设置为“/stripe/webhook”?
-
你使用的是 Laravel 5.1 吗?
-
是的,它的 5.1 @TheShiftExchange
-
你能发布你的路线吗?
-
你确定它是 5.1 吗?因为 BaseVerifer 来自 5.0 - 而不是 5.1
标签: laravel laravel-5 laravel-routing