Docker化Laravel服务器拒绝POST请求,CSRF验证失败求助
Laravel CSRF 验证失败问题求助
我做了一个可完全复现的REST API Laravel服务器Docker镜像,Dockerfile内容如下:
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
之后尝试获取CSRF token:
$ Set-Variable -Name X -Value (curl.exe -X GET -F "source=@input.json" http://127.0.0.1:8008/) # X存储了token: # echo $X # U263lUv3dz9PH7ySm3GmgUUjHjjWm78cqofODUmh
但用这个token发起POST请求时,返回页面过期错误:
$ 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>
补充尝试:我尝试用cookie存储会话信息后重新获取token再发起请求,仍然返回页面过期:
# # 使用新变量Z确保无问题... # $ 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 # 看起来正常,对吗? aHvU5WOaGs9qxOIzgdYb90TJUKPDgDaNhYjQNALW # $ type .\cookiejar # 看起来...嗯...正常(我认为?) # 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 # # 现在满怀期待尝试! # $ curl.exe -c cookiejar --header "X-CSRFToken:$Z" -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 85705 3138 --:--:-- --:--:-- --:--:-- 87833 242 83137 3044 --:--:- <title>Page Expired</title>- -- :--:-- --:--:-- 85637
恳请各位提供帮助,非常感谢!
内容的提问来源于stack exchange,提问作者OrenIshShalom
相关产品推荐
相关产品推荐

