我在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'
];
答案 0 :(得分:2)
鉴于您在原始问题中提供的详细信息,似乎Laravel在拒绝允许您提交表单时的行为完全正确。
用户代理通过iframe浏览到http://some.example.com并POST
将表单发送到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,会自动为您执行此操作。您不太可能需要手动使用此值。