Php Laravel CSRF-419页面已过期,并向其他网站发出了发帖请求

Php Laravel CSRF-419页面已过期,并向其他网站发出了发帖请求,php,ajax,laravel,csrf,Php,Ajax,Laravel,Csrf,目前我在两个网站上工作。一个网站(网站A)是一个简单的CMS,另一个网站(网站B)是一个供用户管理其档案等的常规网站。用户可以在CMS中浏览软件包。这些包是使用来自其他站点(网站B)的AJAX请求接收的。这些包裹也可以买到。当用户购买一个包(网站a)时,一个post请求被发送到另一个网站(网站B) 因此,为了澄清,比如说,我们有网站A和B。当网站A上的用户购买包裹时,一个post请求被发送到“B.com/package/purchase”。这种设计只有一个问题。在Laravel中,每个表单都必须

目前我在两个网站上工作。一个网站(网站A)是一个简单的CMS,另一个网站(网站B)是一个供用户管理其档案等的常规网站。用户可以在CMS中浏览软件包。这些包是使用来自其他站点(网站B)的AJAX请求接收的。这些包裹也可以买到。当用户购买一个包(网站a)时,一个post请求被发送到另一个网站(网站B)

因此,为了澄清,比如说,我们有网站A和B。当网站A上的用户购买包裹时,一个post请求被发送到“B.com/package/purchase”。这种设计只有一个问题。在Laravel中,每个表单都必须发送csrf令牌。因为我向另一个网站发出POST请求,所以我无法从网站a生成CSRF令牌,因为这样请求将始终过期。所以我必须使用网站B的CSRF令牌。我已经尝试过了,但请求仍然返回419页过期错误。我怎样才能解决这个问题

网站A上的表单:(此表单位于javascript追加中,因此引用

'<form method="POST" action="https://rainierlaansite.test/package/' + el.token +'/purchase" id="purchase-form">' +
    '<input type="hidden" value="'+ el.token +'" name="package_token">' +
    '<input name="_token" type="hidden" id="csrf-token" value=' + data[1] + '>' +
      '<h4>' +
        '<a href="#" id="download_package" class="badge badge-pill '+ (el.price == 0 ? 'badge-primary': 'badge-light') +'" onclick="document.getElementById(\'purchase-form\').submit();">' +
            (el.price == 0 ? 'Download': '$ ' + el.price) +
        '</a>' +
      '</h4>' +
'<form>' +

Laravel可以轻松保护您的应用程序免受跨站点请求伪造(CSRF)攻击。跨站点请求伪造是一种恶意攻击,通过这种攻击,代表经过身份验证的用户执行未经授权的命令

Laravel会为应用程序管理的每个活动用户会话自动生成一个CSRF“令牌”。该令牌用于验证经过身份验证的用户是否是实际向应用程序发出请求的用户

默认情况下,laravel通过使用CSRF令牌防止跨站点请求。 如果需要,可以通过将URI添加到VerifyCsrfToken中间件中的except数组来避免CSRF验证

在应用程序的App\Http\Middleware中设置VerifyCsrfToken中间件,如下所示

<?php

namespace App\Http\Middleware;

use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as Middleware;

class VerifyCsrfToken extends Middleware
{
    /**
     * The URIs that should be excluded from CSRF verification.
     *
     * @var array
     */
    protected $except = [
        'api/packages/get',
    ];
}

我尝试将其添加到中间件中,但如果我尝试提交线程中声明的表单,它仍然会给我一个419。我还将
包/{token}/purchase
添加到列表中,但它也会这样做。
 public function get()
    {
        $csrf = json_encode(csrf_token());
        return response()
            ->json([Package::all(),  $csrf]);
    }
<?php

namespace App\Http\Middleware;

use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as Middleware;

class VerifyCsrfToken extends Middleware
{
    /**
     * The URIs that should be excluded from CSRF verification.
     *
     * @var array
     */
    protected $except = [
        'api/packages/get',
    ];
}