簡體   English   中英

php 正在更改原始文件名

[英]php is altering original filename

我有一個文件上傳,並嘗試通過刪除不需要的字符來處理奇怪的文件名。 但是我遇到的情況是,我只是玩弄了不需要的(字符中的)文件名並得到了以下結果:

我的錯誤文件名是: 1\;ping\ -c1\ 1.1.1.1
Firefox 正在發送:
Content-Disposition: form-data; name="send_file"; filename="1\;ping\ -c1\ 1.1.1.1"

但是 PHP 的$_FILES['send_file']['name'] object 只是給了我1.1.1.1 (帶有前導空格)作為名稱。

一般來說,這可以忽略不計,但我想了解這里發生了什么

這里發生了什么? 請賜教

使用的軟件:

  • Ubuntu 18.04 LTS
  • Apache 2.4.29
  • PHP-FPM 7.2
  • Firefox 70

PHP 的$_FILES['send_file']['name']等於Content-Dispositionfilename="..."值。

PHP 正在進行一些清理:刪除路徑並僅存儲文件的名稱,如文檔中所述:

$_FILES['userfile']['name']

客戶端計算機上文件的原始名稱。

刪除路徑意味着刪除最后一個斜杠/反斜杠(包括它們)之前的所有內容,這就是你得到的。

它與 2005 年以來的非常老問題有關,基本上字符\不是 Window 中文件名的有效字符

您可以在此處找到更多詳細信息,以及狀態為Won't fix的舊錯誤

https://pear.php.net/bugs/bug.php?id=5681

一般來說,正如您所知道的,不要在沒有任何驗證的情況下使用$_FILES['send_file']['name']

不可能知道您的$_FILES['send_file']['name']將是什么,因為這是由瀏覽器設置的。 因此,您的瀏覽器會預處理文件名並刪除任何不需要的字符。


讓我們看看當您 select 一個文件並提交您的表單時會發生什么(標題縮寫):

POST /upload.php HTTP/1.1
Host: localhost:8080
Content-Length: 1234
Origin: http://localhost:8080
[...]
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW

------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="send_file"; filename="hello.pdf"
Content-Type: application/x-object

... contents of file goes here ...
------WebKitFormBoundary7MA4YWxkTrZu0gW

在這種情況下, $_FILES['send_file']['name']將設置為hello.pdf


簡而言之,PHP 和您的網絡服務器(據我所知)都不會對文件名進行任何預處理。 它完全由操作系統和用戶的瀏覽器設置。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM