Как изменить имя файла на PHP загрузить на сервер - PullRequest
0 голосов
/ 20 апреля 2020

за несколько дней go я заметил, что мой сайт тратит слишком много времени на загрузку форм POST.

И после небольшого исследования я обнаружил в журналах ошибок своего сервера попытка загрузить вредоносное ПО:

ModSecurity: Rule processing failed (msg=Attempt to upload malware)

Я не знаю, может ли эта проблема быть вызвана вирусом на моем компьютере, или, возможно, у меня возникла другая мысль по этому поводу:

Это происходит только в тех формах, которые имеют вход «Загрузка изображения» ....

Возможно, проблема может заключаться в том, что имена файлов имеют специальные символы, такие как "", ñ, '' и другие. ...

Это скрипт, который я использую для загрузки изображений на мой сайт:

if ($_FILES["image"]["error"] > 0){

    $image_name = "0";

} else {
    //ahora vamos a verificar si el tipo de archivo es un tipo de imagen permitido.
    //y que el tamano del archivo no exceda los 100kb
    $permitidos = array("image/jpg", "image/jpeg", "image/gif", "image/png");
    $limite_kb = 5000;
    $date= date("YmdHis");

    if (in_array($_FILES['image']['type'], $permitidos) && $_FILES['image']['size'] <= $limite_kb * 1024){
        //esta es la ruta donde copiaremos la imagen
        //recuerden que deben crear un directorio con este mismo nombre
        //en el mismo lugar donde se encuentra el archivo subir.php
        $ruta = "../post/clan/" .$sessionid.'-'.$date.$_FILES['image']['name'];
        //comprobamos si este archivo existe para no volverlo a copiar.
        //pero si quieren pueden obviar esto si no es necesario.
        //o pueden darle otro nombre para que no sobreescriba el actual.
        if (!file_exists($ruta)){
            //aqui movemos el archivo desde la ruta temporal a nuestra ruta
            //usamos la variable $resultado para almacenar el resultado del proceso de mover el archivo
            //almacenara true o false
            $resultado = @move_uploaded_file($_FILES["image"]["tmp_name"], $ruta);
            if ($resultado){
                $image_name = $sessionid.'-'.$date.$_FILES['image']['name'];
                //'$nombre'

            $query = "UPDATE clans SET image='$image_name' WHERE id='$clanid' AND user='$sessionid'";
            $result = $mysqli->query($query);


            } else {
                echo "ocurrio un error al mover el archivo.";
            }
        } else {
            echo $_FILES['image']['name'] . ", este archivo existe";
        }
    } else {
        echo "archivo no permitido, es tipo de archivo prohibido o excede el tamano de $limite_kb Kilobytes";
    }
} 

Не могли бы вы, ребята, помочь мне рассказать, как я могу конвертировать имена файлов для удаления специальных символов и пробелы?

Спасибо большое! Надеюсь, что это исправление может решить мою проблему.

1 Ответ

0 голосов
/ 20 апреля 2020

здесь: Как удалить не алфавитные символы c символов? - статья о том, как удалить алфавитные символы c. Чтобы сохранить файл, запустите приведенный там код в $ _FILES ['image'] ['name'] следующим образом:

$name = preg_replace("/[^A-Za-z0-9 ]/", '', $_FILES['image']['name']);

это должно решить вашу проблему, если проблема не возникла ранее в ie, если данные не публикуются в сценарии, но блокируются до того, как они могут туда попасть, из-за правила ModSecurity. В этом случае это совершенно другой вопрос, хотя этот вопрос можно легко решить, удалив эти символы на интерфейс с javascript.

Если на ваш сервер действительно отправляется вредоносное ПО, пожалуйста, уделите время корректной обработке загрузки файлов. Их очень трудно понять правильно, но существуют сотни статей, посвященных тому, как ограничить векторы атак в формах загрузки, поэтому, пожалуйста, go просматривайте их и убедитесь, что вы закрыли как можно больше дыр, прежде чем вы sh загрузить код в производство.

edit:

Вот статья, которая должна помочь вам с безопасностью загрузки изображений

Полностью безопасный сценарий загрузки изображений

...