Redimensionner imaj sou vole

Nan prèske nenpòt aplikasyon entènèt ki sèvi ak imaj, gen yon bezwen yo kreye ti kopi imaj sa yo, e souvan gen plizyè fòma pou imaj adisyonèl.
Ajoute nouvo dimansyon nan yon aplikasyon ki deja egziste tou lakòz kèk tèt fè mal. Pakonsekan travay la:

Objektif Travay la

Ann endike lis kondisyon yo:

  • Jenere imaj adisyonèl nan nenpòt fòma sou vole san yo pa entwodwi plis fonksyonalite nan aplikasyon an nenpòt ki lè pandan egzistans aplikasyon an;
  • Imaj adisyonèl pa bezwen pwodwi sou chak demann;
  • Enfim kapasite pou jenere imaj adisyonèl nan fòma ki pa espesifye.

Mwen pral eksplike dènye pwen an, paske li yon ti kras kontredi premye pwen an. Si nou fè jenerasyon nenpòt imaj louvri, Lè sa a, gen yon posibilite pou yon atak sou sit la pa jenere yon gwo kantite demann pou redimensionner imaj la nan yon kantite enfini fòma, kidonk vilnerabilite sa a bezwen fèmen.

nginx enstalasyon konfigirasyon

Pou rezoud kondisyon ki anwo yo nou bezwen seri modil nginx sa yo:

Modil yo ngx_http_image_filter_module и ngx_http_secure_link_module yo pa enstale pa default, kidonk yo dwe espesifye nan etap konfigirasyon enstalasyon an nginx:

phoinix@phoinix-work:~/src/nginx-0.8.29
$ ./configure --with-http_secure_link_module --with-http_image_filter_module

nginx konfigirasyon

Nou ajoute yon nouvo nan konfigirasyon lame nou an kote ak paramèt kachèt jeneral:

...
    proxy_cache_path /www/myprojects/cache levels=1:2 keys_zone=image-preview:10m;
...
    server {
...
        location ~ ^/preview/([cir])/(.+) {
        # Тип операции
            set                         $oper $1;
        # Параметры изображения и путь к файлу
            set                         $remn $2;
        # Проксируем на отдельный хост
            proxy_pass                  http://myproject.ru:81/$oper/$remn;
            proxy_intercept_errors      on;
            error_page                  404 = /preview/404;
        # Кеширование
            proxy_cache                 image-preview;
            proxy_cache_key             "$host$document_uri";
        # 200 ответы кешируем на 1 день
            proxy_cache_valid           200 1d;
        # остальные ответы кешируем на 1 минуту
            proxy_cache_valid           any 1m;
        }
        
        # Возвращаем ошибку
        location = /preview/404 {
            internal;
            default_type                image/gif;
            alias                       /www/myprojects/image/noimage.gif;
        }
...
    }
...

Nou ajoute tou yon nouvo lame nan konfigirasyon an:

server {
    server_name                     myproject.ru;
    listen                          81;

    access_log                      /www/myproject.ru/logs/nginx.preview.access_log;
    error_log                       /www/myproject.ru/logs/nginx.preview.error_log info;

    # Указываем секретное слово для md5
    secure_link_secret              secret;

    # Ошибки отправляем она отдельный location
    error_page                      403 404 415 500 502 503 504 = @404;

    # location Для фильтра size
    location ~ ^/i/[^/]+/(.+) {
        
        # грязный хак от Игоря Сысоева *
        alias                       /www/myproject.ru/images/$1;
        try_files                   "" @404;
    
        # Проверяем правильность ссылки и md5
        if ($secure_link = "") { return 404; }
        
        # Используем соответсвующий фильтр
        image_filter                size;
    }

    # По аналогии остальные location для других фильтров
    location ~ ^/c/[^/]+/(d+|-)x(d+|-)/(.+) {
        set                         $width  $1;
        set                         $height $2;
        
        alias                       /www/myproject.ru/images/$3;
        try_files                   "" @404;
    
        if ($secure_link = "") { return 404; }
    
        image_filter                crop  $width  $height;
    }
    
    location ~ ^/r/[^/]+/(d+|-)x(d+|-)/(.+) {
        set                         $width  $1;
        set                         $height $2;

        alias                       /www/myproject.ru/images/$3;
        try_files                   "" @404;

        if ($secure_link = "") { return 404; }

        image_filter                resize  $width  $height;
    }

    location @404 { return 404; }
}

Kòm yon rezilta, imaj adisyonèl ka jwenn lè l sèvi avèk lyen sa yo:

* try_files - sansib nan espas ak karaktè Ris, kidonk mwen te oblije fè yon beki ak alyas.

Itilize nan yon aplikasyon entènèt

Nan nivo aplikasyon entènèt la, ou ka fè pwosedi sa a (Perl):

sub proxy_image {
    use Digest::MD5     qw /md5_hex/;
    my %params = @_;
    my $filter = {
                    size    => 'i',
                    resize  => 'r',
                    crop    => 'c'            
                  }->{$params{filter}} || 'r';
    my $path = ($filter ne 'i' ?
                    ( $params{height} || '_' ) . 'x' . ( $params{width} || '_' ) . '/' :
                    ()
               ) . $params{source};
    my $md5 = md5_hex( $path . 'secret' );
    $path = '/preview/' . $filter . '/' . $md5 . '/' . $path;
    return $path;
}

my $preview_path = &proxy_image(
                    source  => 'image1.jpg',
                    height  => 100,
                    width   => 100,
                    filter  => 'resize'
                );

Malgre ke mwen ta rekòmande tou pou kalkile gwosè yo preview.

Rato

Lè w ap efase imaj orijinal la, aperçu, natirèlman, pa pral efase nan kachèt la jiskaske kachèt la invalid, ak nan ka nou an, aperçu ka egziste pou yon jou apre sipresyon, men sa a se tan an maksimòm.

orijinal la

Sous: www.habr.com

Add nouvo kòmantè