以下是REST API Laravel服务器的completely reproducible个docker镜像:

FROM php
RUN apt-get update
RUN apt-get install zip -y
COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer
RUN composer create-project laravel/laravel frontend
WORKDIR frontend
COPY web.php web.php
RUN mv web.php routes
EXPOSE 8000
CMD [ "php", "artisan", "serve", "--host", "0.0.0.0" ]

我唯一编辑的是一个端点(web.php):

<?php

use Illuminate\Support\Facades\Route;

Route::get('/', function () {
    return csrf_token();
});

Route::post('/', function (Request $request) {
    if ($request->hasFile('source'    )) { return ">> GOOD ! <<"; }
    if ($request->hasFile('input.json')) { return ">> GOOD ! <<"; }

    $x = count($_FILES);

    return "DD >> $x << DD";
});

我构建并运行docker映像,如下所示:

$ docker build --tag host.translator.php --file Dockerfile .
$ docker run -p 8008:8000 -d -t --name translator.php host.translator.php

然后就像相关文章说的(hereand hereand also here):

$ Set-Variable -Name X -Value (curl.exe -X GET -F "source=@input.json" http://127.0.0.1:8008/)
# X holds the token:
# echo $X
# U263lUv3dz9PH7ySm3GmgUUjHjjWm78cqofODUmh

但当我try 使用该令牌时,它不起作用:

$ curl.exe --header "X-CSRFToken:$X" -X POST -F "source=@input.json" http://127.0.0.1:8008/ | Select-String "<title>Page Expired"
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  6851    0  6609  100   242  80486   2947 --:--:-- --:--:-- --:--:-- 83548

        <title>Page Expired</title>

如有任何帮助,我们将不胜感激,谢谢!

EDIT:

#
# used a new variable Z - just to be sure ...
#
$ Set-Variable -Name Z -Value (curl.exe -b cookiejar -X GET -F "source=@input.json" http://127.0.0.1:8008/)
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   282    0    40  100   242    527   3194 --:--:-- --:--:-- --:--:--  3760
$ echo $Z # this looks good, right ?
aHvU5WOaGs9qxOIzgdYb90TJUKPDgDaNhYjQNALW
#
$ type .\cookiejar # this looks ... hmmm ... good (I think ?)
# Netscape HTTP Cookie File
# https://curl.se/docs/http-cookies.html
# This file was generated by libcurl! Edit at your own risk.

#HttpOnly_127.0.0.1     FALSE   /       FALSE   1711103819      laravel_session eyJpdiI6IllsOW9KdlVzT1ZPcUJDOUdQRnUyZHc9PSIsInZhbHVlIjoiekpING13WFRaaDRLUHBUcVpNM0VjblBwVjlXM1VrSU1uYUF3dk43d0J6c0RvSDJ5UWZOU3lla1lKVjBNRnNVTXJOaTNMdmt3dlIvdW5HZDk1ODZUb0gxVWMySHh5cXBWeG5XbjVMQlpMQ2xoMzM0ODROQ1FGQ0NMQzFNaHNQMXMiLCJtYWMiOiI0MTg3ZTM0NTlmNWMzZGUyZDY3YzI2YWViYzc2MDZhMjAyMjA2NzE5YmRmYTRmYWRmYzQxODIzYmVlOThlZTkxIiwidGFnIjoiIn0%3D
#
# Now let's cross our fingers extra strong !
#
$ curl.exe -c cookiejar --header "X-CSRFToken:$Z" -X POST -F "source=@input.json" http://127.0.0.1:8008/ | Select-String "<title>Pa
ge Expired"
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  6851    0  6609  100   242  85705   3138 --:--:-- --:--:-- --:--:-- 87833
242  83137   3044 --:--:-        <title>Page Expired</title>- --
:--:-- --:--:-- 85637

推荐答案

CSRF(跨站点请求伪造)是保护服务器免受伪造的一种方式.

https://laravel.com/docs/11.x/csrf

为了以正常的方式传递此验证,您需要传递一个X-CSRF-TOKEN header(not X-CSRFToken,就像您使用错别字时所做的那样)并传递一个正确的CSRF令牌.

CSRF令牌的机制如下:

  • 该站点允许您运行某些入口点(例如,某些GET请求)而不通过CSRF
  • 之后,您需要在可能发送的任何POST请求时正确设置CSRF令牌的报头
  • 每当处理页面/请求时,旧的CSRF令牌将无效,并且您的会话将获得一个新的CSRF令牌,该令牌需要在下一次POST中传递,而不是上一次POST中传递

因此,如果您通过cURL发送POST请求,则需要确定一个CSRF令牌,这是真的,但您需要发送最新的令牌.

您可以从CSRF保护中排除URL,but be careful, don't reduce your security standards if possible通过

->withMiddleware(function (Middleware $middleware) {
    $middleware->validateCsrfTokens(except: [
        'stripe/*',
        'http://example.com/foo/bar',
        'http://example.com/foo/*',
    ]);
})

然后这个请求会得到妥善处理.如果它是一个入口点(比如发布用于SSO的JWT),那么允许该特定端点在没有CSRF的情况下运行是有意义的,因为它无论如何都在验证用户.否则,您将始终需要获取最新的CSRF令牌并将其添加到请求的头中.

Php相关问答推荐

从WooCommerce邮箱通知中的订单详细信息中删除产品列表

我如何知道BaseController中当前运行的是哪个控制器?

显示WooCommerce当前产品类别或标签的短代码

如何修复警告:当使用WordPress get_the_Terms()时,Foreach()参数必须是ARRAY|OBJECT类型?

允许在WooCommerce管理员优惠券列表中显示自定义优惠券类型

不包括WooCommerce中单独销售的产品

根据WooCommerce购物车页面中的自定义 Select 添加费用

如果日期是过go 日期,则隐藏事件发布类型

为WooCommerce中存储一些数据的购物车项目添加复选框

Mockery在模拟Redis连接时抛出错误:Mockery\Exception\BadMethodCallException

用ajax获取文件 - CORS问题&;设置缓存?

Laravel 10 中的自定义类未找到

PHP 中使用 JSON 的自定义会话处理程序会因错误而 destruct 会话

PHP 解析 XML 以获取多个深度的所有字符串值

计算数组中连续值的数量

仅在管理员新订单通知中显示WooCommerce订单商品自定义元数据

在 PHP 中验证签名

判断类别是否存在 Shopware 6

使用 RSA 2048 公钥验证 RSA PKCS#1v1.5 SHA 256 签名

Symfony 在将它传递给 Twig 时是否从数据库中获取整个对象?