php меняет оригинальное имя файла - PullRequest
6 голосов
/ 31 октября 2019

Я загружаю файл и пытаюсь позаботиться о странных именах файлов, удалив ненужные символы. Но у меня есть ситуация, когда я просто поигрался с нежелательными (символами) именами файлов и получил следующий результат:

Мое неверное имя файла: 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'] просто дает мне 1.1.1.1 (с начальным пробелом) в качестве имени.

В общем, это будет игнорироваться, но я бы хотел понять, что происходитздесь

Что здесь происходит? Пожалуйста, просветите меня

Используемое программное обеспечение:

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

Ответы [ 3 ]

2 голосов
/ 08 ноября 2019

PHP $_FILES['send_file']['name'] делает не равным Content-Disposition filename="..." значению.

PHP выполняет некоторую очистку: удаляет путь и сохраняет только имя файла , как сказано в документации :

$ _ FILES ['userfile'] ['name']

Исходное имя файла на клиентском компьютере.

Удаление пути означает, что все до последнего слэша / обратного слэша (включая их) удалены, вот чтоВы получили.

1 голос
/ 07 ноября 2019

Это относится к очень старой проблеме с 2005 года, и в основном символ \ не является допустимым символом для имени файла в Window

Более подробную информацию вы можете найти здесь, и старая ошибка со статусом Не исправлю

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

0 голосов
/ 05 ноября 2019

В общем, как вы уже поняли, никогда не используйте $_FILES['send_file']['name'] без какой-либо проверки.

Невозможно сказать, каким будет ваш $_FILES['send_file']['name'], потому что это установлено браузером. Поэтому ваш браузер предварительно обрабатывает имя файла и удаляет все нежелательные символы.


Давайте посмотрим, что происходит, когда вы выбираете файл и отправляете форму (заголовки сокращены):

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, ни ваш веб-сервер не выполняют (насколько мне известно) никакой предварительной обработки имени файла. Он устанавливается операционной системой и браузером вашего пользователя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...