Ngowahi ukuran gambar ing fly

Ing meh kabeh aplikasi web sing nggunakake gambar, ana perlu kanggo nggawe salinan cilik saka gambar iki, lan asring ana sawetara format kanggo gambar tambahan.
Nambahake dimensi anyar menyang aplikasi sing wis ana uga nyebabake sawetara ngelu. Dadi tugas:

Tujuan

Ayo menehi tandha dhaptar syarat:

  • Ngasilake gambar tambahan saka format apa wae kanthi cepet tanpa ngenalake fungsi tambahan menyang aplikasi kapan wae sajrone anane aplikasi;
  • Gambar tambahan ora perlu digawe ing saben panyuwunan;
  • Pateni kemampuan kanggo ngasilake gambar tambahan saka format sing ora ditemtokake.

Aku bakal nerangake titik pungkasan, amarga rada mbantah titik pisanan. Yen kita nggawe generasi gambar apa wae sing mbukak, mula ana kemungkinan serangan ing situs kasebut kanthi ngasilake akeh panjaluk kanggo ngowahi ukuran gambar dadi format sing ora ana watese, mula kerentanan iki kudu ditutup.

konfigurasi instalasi nginx

Kanggo ngatasi syarat ing ndhuwur, kita butuh set modul nginx ing ngisor iki:

Modul ngx_http_image_filter_module и ngx_http_secure_link_module ora diinstal kanthi gawan, mula kudu ditemtokake ing tataran konfigurasi instalasi nginx:

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

konfigurasi nginx

Kita nambah sing anyar kanggo konfigurasi host kita lokasi lan paramèter cache umum:

...
    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;
        }
...
    }
...

Kita uga nambah host anyar menyang konfigurasi:

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; }
}

Akibaté, gambar tambahan bisa dipikolehi kanthi nggunakake tautan ing ngisor iki:

* coba_file - sensitif spasi lan karakter Russian, supaya aku kudu nggawe crutch karo alias.

Gunakake ing aplikasi web

Ing tingkat aplikasi web, sampeyan bisa nindakake prosedur ing ngisor iki (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'
                );

Sanajan aku uga menehi saran kanggo ngitung ukuran pratayang.

Rake

Nalika mbusak gambar asli, pratinjau, kanthi alami, ora bakal dibusak saka cache nganti cache ora valid, lan ing kasus kita, pratinjau bisa ana sedina sawise pambusakan, nanging iki wektu maksimal.

aslinipun

Source: www.habr.com

Add a comment