从iframe内部发布时的Laravel TokenMismatchExpection

时间:2016-01-08 00:19:35

标签: php laravel laravel-5 laravel-5.1 laravel-5.2

我在http://some.example.com/myiframes/default.aspx上运行了一个页面。此页面包含iframe。 iframe源/包含Laravel 5.2基础应用程序。

我的Laravel页面网址"这是iframe的来源"是https://laravel.example.com

https://laravel.example.com有一个带有提交按钮的表单。当用户点击它时,他/她会在同一个域上点击另一条路线,即https://laravel.example.com/disply/survey

但每次,我都会提交表单,我会收到以下异常

TokenMismatchException in VerifyCsrfToken.php line 67:

为了确保我清楚,在页面http://some.example.com/myiframes/default.aspx上我的代码看起来像这样

 

在我的laravel App上,位于https://laravel.example.com这里是我的表格

    <form method="POST" action="https://laravel.example.com/disply/survey" accept-charset="UTF-8" class="form">
<input name="_token" type="hidden" value="Dk6SN4WzO4brbvdnBO6JZ7e1lBGjmYz8GQJ1lYFo">
<input name="survey_id" type="hidden" value="10">
<input name="call_id" type="hidden" value="667">
<input name="pools" type="hidden">

<input name="alt_id_1" type="hidden" value="250">
<input name="alt_id_2" type="hidden" value="5">
<input name="alt_id_3" type="hidden">
<input name="alt_id_4" type="hidden">
<input name="alt_id_5" type="hidden">
<input name="alt_id_6" type="hidden">
<input name="alt_id_7" type="hidden">
<input name="alt_id_8" type="hidden">
<input name="alt_id_9" type="hidden">
<input name="alt_id_10" type="hidden">


<input name="alt_string_1" type="hidden">
<input name="alt_string_2" type="hidden">
<input name="alt_string_3" type="hidden">
<input name="alt_string_4" type="hidden">
<input name="alt_string_5" type="hidden">
<input name="alt_string_6" type="hidden">
<input name="alt_string_7" type="hidden">
<input name="alt_string_8" type="hidden">
<input name="alt_string_9" type="hidden">
<input name="alt_string_10" type="hidden">

<div class="text-center"> 
    <input class="btn btn-primary" type="submit" value="Start Survey">
</div>

</form>

表单在iframe之外完美运行。只有当我在iframe中时才会出现问题。

我打开位于VerifyCsrfToken的{​​{1}}课程并添加了 App\Http\Middleware进入$ except数组,但没有解决问题。

http://some.example.com

可能导致此问题的原因是什么? 我该如何纠正这个问题?

已编辑,这是我的模板

protected $except = [
    'http://some.example.com'
];

2 个答案:

答案 0 :(得分:2)

鉴于您在原始问题中提供的详细信息,似乎Laravel在拒绝允许您提交表单时的行为完全正确。

用户代理通过iframe浏览到http://some.example.comPOST将表单发送到https://laravel.example.com。如果我没有弄错的话,这正是CSRF令牌旨在防止的行为。

这个问题甚至可能与Laravel 5 TokenMismatchException only in iFrame重复。我同意那里接受的答案。

如果这是一个内部网站,并且您愿意接受相关风险,则可以为您POST的路由添加例外,如上述答案中所述。

答案 1 :(得分:0)

请按照以下步骤

https://laravel.com/docs/master/routing#csrf-x-csrf-token

X-CSRF-TOKEN

除了检查CSRF令牌作为POST参数之外,Laravel VerifyCsrfToken中间件还将检查X-CSRF-TOKEN请求头。例如,您可以将令牌存储在“meta”标记中:

创建元标记后,您可以指示像jQuery这样的库将标记添加到所有请求标头中。这为基于AJAX的应用程序提供了简单,方便的CSRF保护:

$。ajaxSetup({         标题:{             'X-CSRF-TOKEN':$('meta [name =“csrf-token”]')。attr('content')         } });

X-XSRF-TOKEN

Laravel还将CSRF令牌存储在XSRF-TOKEN cookie中。您可以使用cookie值来设置X-XSRF-TOKEN请求标头。一些JavaScript框架,如Angular,会自动为您执行此操作。您不太可能需要手动使用此值。