Я проверил форум и не могу найти ничего, что совпадает с моей проблемой. Даже когда я печатал заголовок, я читал статьи.
Это может быть немного сложнее, поэтому я разобью его так легко, как смогу. Спасибо всем, кто хочет взять это на ….
Моя цель — иметь возможность безопасно загружать файлы и переименовывать потенциально опасные файлы с бесполезным расширением. То, что происходит, это КАЖДАЯ загрузка, которая проходит хорошо, добавляет к ней суффикс $, хотя этот метод содержит мое условное утверждение:
$nameparts = pathinfo($nospaces);
$extension = isset($nameparts['extension']) ? $nameparts['extension'] : '';
if (!$this->typeCheckingOn && !empty($this->suffix)){
if (in_array($extension, $this->notTrusted) || empty($extention)){
$this->newName = $nospaces . $this->suffix;
}protected function moveFile($file)
{
$result = $file['name']. ' was uploaded successfully';
if (!is_null($this->newName)){
$result .= ', and was renamed ' . $this->newName;
}
}
Но вот полная разбивка кода, который имеет значение (кроме того, что мне не хватает)
protected $permittedTypes = array(
'image/jpeg',
'image/pjpeg',
'image/gif',
'image/png',
'image/webp',
);
protected $newName;
protected $typeCheckingOn = true;
protected $notTrusted = array ('bin', 'cgi','exe','js','pl','php', 'py', 'sh');
protected $suffix = '.upload';
и публичные методы:
public function allowAllTypes($suffix = null)
{
$this->typeCheckingOn = false;
if(!is_null($suffix)) {
if (strpos($suffix, '.') === 0 || $suffix == '') {
$this->suffix = $suffix;
}else {
$this->suffix = ".$suffix";
}
}
}
public function upload()
{
$uploaded = current($_FILES);
if($this->checkFile($uploaded)){
$this->moveFile($uploaded);
}
}
public function getMessages()
{
return $this->messages;
}
protected function checkFile($file)
{
if ($file['error'] !=0){
$this->getErrorMessage($file);
return false;
}
if (!$this->checkSize($file)){
return false;
}
if ($this->typeCheckingOn){
if (!$this->checkType($file)){
return false;
}
}
$this->checkName($file);
return true;
}
protected function checkType($file)
{
if (in_array($file['type'], $this->permittedTypes)){
return true ;
} else{
$this->messages[] = $file['name'] . ' is not a permitted type of file.';
return false;
}}
protected function checkName($file)
{
$this->newName = NULL;
$nospaces = str_replace(' ', '_', $file['name']);
if ($nospaces != $file['name']){
$this->newName = $nospaces;
}
$nameparts = pathinfo($nospaces);
$extension = isset($nameparts['extension']) ? $nameparts['extension'] : '';
if (!$this->typeCheckingOn && !empty($this->suffix)){
if (in_array($extension, $this->notTrusted) || empty($extention)){
$this->newName = $nospaces . $this->suffix;
}
}
}
protected function moveFile($file)
{
$result = $file['name']. ' was uploaded successfully';
if (!is_null($this->newName)){
$result .= ', and was renamed ' . $this->newName;
}
$result .= '.';
$this->messages[] = $result;
}
}
Как я уже сказал, все файлы, которые проходят другие проверки, будут загружены. Он может распознать неправильный файл и остановить его, если он в списке, НО ЭТО ПЕРЕИМЕНУЕТ КАЖДЫЙ ХОРОШИЙ ФАЙЛ с суффиксом $.
Условное выражение выглядит хорошо и сообщает, что если есть pathinfo [‘extension’] И typeChecking выключен, а суффикс не пустой, И ЕСЛИ ТАК, ТО, ЕСЛИ этот суффикс находится в списке ненадежных ИЛИ пуст — это единственный раз, когда он следует добавить расширение.
НО ЭТО ДОБАВЛЯЕТ СУФФИКС НА КАЖДОЙ ХОРОШЕЙ ЗАГРУЗКЕ.
Может ли кто-нибудь помочь мне подсказать, что я могу делать не так? Я надеюсь, что объяснил свою проблему без запутывания. Я постараюсь ответить на каждый вопрос как можно лучше.
Спасибо всем, кто нашел время, чтобы помочь.
Ура!
пусто ($ продление) <- расширение пишется по-разному
Других решений пока нет …