【发布时间】:2017-07-31 20:37:50
【问题描述】:
我正在运行以下环境:
- PHP 7.1.7
- IIS 10
- Windows 10 1703
- Laravel 5.4.30
这是我的上传脚本(非常简单,接受所有上传):
public function uploadToTemporary(AttachmentUploadRequest $request)
{
/** @var \Illuminate\Http\UploadedFile $file */
$file = $request->file('file');
return [
'name' => $file->getClientOriginalName(),
'location' => $file->store('temporary'),
];
}
我的AttachmentUploadRequest 规则:
public function rules()
{
return [
'file' => 'file|max:20000',
];
}
当我上传扩展名为 .msg、.exe 的文件时,我收到:
(1/1) 错误异常 fopen(C:\Users\Steve\Websites\tickets\storage\app\temporary/V4WslICBUK3TjK9Cn46nmKkXxtJVAGfDkxJiN9Lg.): 无法打开流:权限被拒绝
问题是,我可以成功上传所有其他类型的文件。以下是在没有任何权限问题的情况下成功上传的文件扩展名:
- .docx, .doc
- .pptx、.ppt
- .xlsx, .xls
- .txt
- .mp4、.avi、.mp3
- .vrd
- .jpg、.gif、.bmp
有人知道为什么会这样吗?
编辑:我通过下载1.1mb 可执行文件并上传它来验证文件已成功保存在临时 Windows 位置:
【问题讨论】:
-
您是否正在运行 mod_security?如果是这样 - 检查
SecRule指令 -
我不知道有
mod_security扩展名。通过谷歌搜索,看起来像一个 Apache 模块?我没有配置它,这是肯定的。 -
服务器可能正在运行 DLP。将扩展名从 .exe 更改为 ,rename 怎么样?如果您重命名为不同的扩展名,Web 服务器应该接受您的 exe 文件。
-
是的,它是 Apache 的一个模块,它扫描文件并阻止它们首先被上传,从而导致 500 错误。它也可以在签名的基础上工作,因此更改扩展名不起作用,但是看到文件被放置在不是它的服务器上(问题出在 PHP 中)。你能按照@Leptonator 的建议去做吗?
-
@Leptonator,不幸的是,我通过将
.exe重命名为.rename或任何其他名称收到了同样的异常。太奇怪了!