Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > src тэга IMG - чем грозит безопасности?


Автор: s0lman 11.3.2009, 21:54
Привет всем.
Использую скрипт для  создания уменьшенной копии изображения, который используется следующим образом
Код

<IMG src="getimg.php?src=mypicture.jpg">

Наверняка все или почти все с подобными встречались.
Вопрос в следующем: насколько безопасно в GET параметре передавать путь к файлу? Чем может навредить потенциальный злоумышленник?
Спасибо.

Автор: enof 11.3.2009, 22:01
s0lman, смотря как используются введенные данные.

Автор: s0lman 11.3.2009, 22:07
Вот эта функция
путь к файлу - $this->src
Код

public function img_resize(){

        $link_array = explode('.',$this->src);
        $filetype=$link_array[count($link_array)-1];


        if(!file_exists($this->src)){
            $size=$this->width;
        }
        else $size = getimagesize($this->src);

        if ($size === false) return false;
        // Определяем исходный формат по MIME-информации, предоставленной
        // функцией getimagesize, и выбираем соответствующую формату
        // imagecreatefrom-функцию.
        $format = strtolower(substr($size['mime'], strpos($size['mime'], '/') + 1));
        $icfunc = "imagecreatefrom" . $format;
        if (!function_exists($icfunc)) return false;

        if (intval($this->width) == 0) {
            $new_width = round($size[0]);
            $new_height = round($size[1]);
        } else {
            if($size[0]>=$size[1]) {$ratio = $size[0] / $this->width;}
             else { $ratio = $size[1]/$this->height;}
            $new_width = round($size[0] / $ratio);
            $new_height = round($size[1] / $ratio);
            $new_left = 0; //$use_x_ratio  ? 0 : floor(($$this->width - $new_width) / 2);
            $new_top = 0; //!$use_x_ratio ? 0 : floor(($height - $new_height) / 2);
        }

        $isrc = $icfunc($this->src);
        $idest = imagecreatetruecolor($new_width, $new_height);

        imagefill($idest, 0, 0, RGB);

        imagecopyresampled($idest, $isrc, $new_left, $new_top, 0, 0,
            $new_width, $new_height, $size[0], $size[1]);

        if (!file_exists($this->src)) {
            $textcolor = imagecolorallocate($idest, 255, 0, 0);
            // write the string at the top left
            imagestring($idest, 2, 0, 0, "Not found", $textcolor);
        }
        switch ($filetype) {
            case 'jpg':
                imagejpeg($idest);
                break;
            case 'gif': // константное выражение 2
                imagegif($idest);
                break;
        }
        imagedestroy($isrc);
        imagedestroy($idest);
        return true;
    }

Автор: nerezus 11.3.2009, 22:14
<img src="javascript:alert('бебебе')">

+ basic-авторизация может на картинке стоять - и пользователь получит окошко для ввода пароля.

Автор: gta4kv 11.3.2009, 22:20
s0lman, проверяй расширение файла, что бы не внешняя ссылка была и что бы файл существовал. (наверное под картинки же отдельная папка (if(file_exists( 'path/to/folder' . $image )))

Добавлено @ 22:21
Код

   if(!file_exists($this->src)){
            $size=$this->width;
        }
        else $size = getimagesize($this->src);
        if ($size === false) return false;


O_O

Код

$size = (file_exists($this->src) ? getimagesize($this->src) : (return false));

Автор: s0lman 12.3.2009, 12:16
Позволю себе немного исправить
Код

$size = (file_exists($this->src) ? getimagesize($this->src) : (false));


smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)