Bild änneren op der fléien

A bal all Webapplikatioun déi Biller benotzt, ass et néideg fir kleng Kopien vun dëse Biller ze kreéieren, an dacks ginn et verschidde Formater fir zousätzlech Biller.
Nei Dimensiounen un eng existent Applikatioun bäizefügen verursaacht och e puer Kappwéi. Dofir d'Aufgab:

Objective

Loosst eis d'Lëscht vun den Ufuerderunge bezeechnen:

  • Generéiere zousätzlech Biller vun all Format op der Flucht ouni zousätzlech Funktionalitéit an der Applikatioun zu all Moment während der Existenz vun der Applikatioun aféieren;
  • Zousätzlech Biller mussen net op all Ufro generéiert ginn;
  • Deaktivéiert d'Fäegkeet fir zousätzlech Biller vun onspezifizéierten Formater ze generéieren.

Ech wäert de leschte Punkt erklären, well et dem éischte Punkt liicht widdersprécht. Wa mir d'Generatioun vun all Biller opmaachen, da gëtt et eng Méiglechkeet vun engem Attack op de Site andeems Dir eng grouss Unzuel vun Ufroe generéiert fir d'Gréisst vum Bild an eng onendlech Unzuel u Formater z'änneren, sou datt dës Schwachstelle muss zougemaach ginn.

nginx Installatiounskonfiguratioun

Fir déi uewe genannten Ufuerderungen ze léisen brauche mir de folgende Set vun nginx Moduler:

Modul ngx_http_image_filter_module и ngx_http_secure_link_module sinn net als Standard installéiert, also musse se an der Installatiounskonfiguratiounsstadium spezifizéiert ginn nginx:

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

nginx Konfiguratioun

Mir addéieren en neien un eis Hostkonfiguratioun Standuert an allgemeng Cache Parameteren:

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

Mir addéieren och en neien Host an d'Konfiguratioun:

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

Als Resultat kënnen zousätzlech Biller mat de folgende Linken kritt ginn:

* probéieren_dateien - empfindlech op Plazen a russesch Zeechen, also ech hu missen eng Krut maachen mat alias.

Benotzt an enger Webapplikatioun

Um Webapplikatiounsniveau kënnt Dir déi folgend Prozedur maachen (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'
                );

Obwuel ech géif och recommandéieren d'Gréissten ze berechnen Virgeschmaach.

Rake

Wann d'Originalbild geläscht gëtt, ginn d'Virschau natierlech net aus dem Cache geläscht bis de Cache ongëlteg ass, an an eisem Fall kënne Virschau fir en Dag no der Läschung existéieren, awer dëst ass déi maximal Zäit.

den Original

Source: will.com

Setzt e Commentaire