[英]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
(帶有前導空格)作為名稱。
一般來說,這可以忽略不計,但我想了解這里發生了什么
這里發生了什么? 請賜教
使用的軟件:
PHP 的$_FILES['send_file']['name']
不等於Content-Disposition
的filename="..."
值。
PHP 正在進行一些清理:刪除路徑並僅存儲文件的名稱,如文檔中所述:
$_FILES['userfile']['name']
客戶端計算機上文件的原始名稱。
刪除路徑意味着刪除最后一個斜杠/反斜杠(包括它們)之前的所有內容,這就是你得到的。
它與 2005 年以來的非常老問題有關,基本上字符\
不是 Window 中文件名的有效字符
您可以在此處找到更多詳細信息,以及狀態為Won't fix的舊錯誤
一般來說,正如您所知道的,不要在沒有任何驗證的情況下使用$_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.