Wykorzystanie modułu http_secure_link w PHP

Odpowiedz Nowy wątek
2016-03-23 14:31
0

Witam, muszę wykorzystać moduł Nginx http_secure_link do generowania linków do video składowanych na FTP, jednakże nie wiem jak to ugryźć. Czy są jakieś gotowe zastosowania do PHP? Czytając to: http://nginx.org/en/docs/http/ngx_http_secure_link_module.html
Nie mam pojęcia jak tego użyć do linkowania video w aplikacji w PHP. Czy ktoś może mniej więcej mnie naprowadzić co zrobić żeby serwować video na stronie za pomocą tego modułu?

Pozdrawiam

Pozostało 580 znaków

2016-03-24 01:51
1

Zasada działania jest taka:

  1. Po stronie php generujesz unikatowy link w stylu
    <?php
    $expires = time()+60; //60sekund wazny
    $key =  md5("/files/sasha_grey_bathroom.webp{$expires} <sekretny klucz>");//uwazaj na spacje!
    echo "<a href='/files/sasha_grey_bathroom.webp?md5={$key}&amp;expires={$expires}'>download</a>";
  2. Następnie ustawiasz w ustawieniach nginxa
location /files/ {
    secure_link $arg_md5,$arg_expires;
    secure_link_md5 "$uri$secure_link_expires <sekretny klucz>";

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

    if ($secure_link = "0") {
        return 410;
    }

}
  1. I tylko wyłącznie zostanie plik pobrany, jeśli użytkownik odgadnie hash ;)
    4.76 - JKM

:)
edytowany 4x, ostatnio: bordeux, 2016-03-24 01:59

Pozostało 580 znaków

2016-03-24 19:20
0

@bordeux

Zrobiłem tak jak pokazałeś:

W kontrolerze mam metodę

public function showVideo($id){
        $video = Video::findOrFail($id);
        $expires = time()+60;
        $key = md5($video->path.$expires." abc");
        return view('videos.video', compact('video', 'expires', 'key'));
    } 

Następnie w widoku robię coś takiego:


<source src="{{$video->path."?md5=".$key."&amp;expires=".$expires}}" type='video/mp4' />

A w konfiguracji ngina mam tak:

server {
  listen        80;
  server_name   www.mysite.com mysite.com;

  location / {
        root /var/www/videos;
   secure_link $arg_md5,$arg_expires;
    secure_link_md5 "$uri$secure_link_expires abc";

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

    if ($secure_link = "0") {
        return 410;
    }

    autoindex on;
  }
}

Niestety to nie działa. Czy popełniłem gdzieś błąd?

Pozostało 580 znaków

2016-03-24 19:23
0

Co masz na myśli że nie działa? Jakiś error log, kod odpowiedzi jakiś?

zrób jeszcze

<?php
$md5 = base64_encode($md5); 

aby wyeliminować wątpliwość


:)
edytowany 1x, ostatnio: bordeux, 2016-03-24 19:28

Pozostało 580 znaków

2016-03-24 19:27
0
bordeux napisał(a):

Co masz na myśli że nie działa? Jakiś error log, kod odpowiedzi jakiś?

Serwer nie zwraca pliku, wyskakuje 403.

@bordeux

Po zmianie na:

  $video = Video::findOrFail($id);
        $expires = time()+60;
        $key = md5($video->path.$expires." abc");
        $md5 = base64_encode($key);

Problem nadal występuje.

edytowany 1x, ostatnio: yakuzafu, 2016-03-24 19:41
poprawiłem odpowiedź :) ^ Dodaj jeszcze b64 - bordeux 2016-03-24 19:28
@bordeux mam to tylko dodać do metody w kontrolerze i wystarczy, tak? - yakuzafu 2016-03-24 19:32

Pozostało 580 znaków

2016-03-24 19:39

To jest poprawna funkcja do generowania md5 klucza:

<?php
$string = "2147483647/s/link127.0.0.1 secret";

$md5 =  base64_encode(md5($string, true));
$replaces = [
        "+" => "-",
        "/" => "_",
        "=" => ""
    ];
$md5 = str_replace(array_keys($replaces), array_values($replaces), $md5);
echo $md5;

Tak jak w dokumentacji:

echo -n '2147483647/s/link127.0.0.1 secret' | \
    openssl md5 -binary | openssl base64 | tr +/ -_ | tr -d =

:)

Pozostało 580 znaków

2016-03-24 19:44
0

@bordeux

Teraz pytanie: jeśli $video->path zwraca przykładowo: "http://10.10.10.10/XXX/XXX.mp4" to przy takim generowaniu md5 będzie ok? Plik jest na innym serwerze niż aplikacja.

Pokaż pozostałe 3 komentarze
@bordeux tak, wiem, robię to takim sposobem: $md5 = base64_encode(md5('/'.$video->base62_id.'/'.$video->base62_id.'.mp4'.$expires." abc")); gdzie base62_id to identyfikator video. Niestety dalej nie działa. - yakuzafu 2016-03-24 20:23
a taki plik istnieje na serwerze? - bordeux 2016-03-24 20:24
Tak, usuwając linijki odpowiedzialne za secure link w pliku konfiguracyjnym video normalnie się odpala. - yakuzafu 2016-03-24 20:25
@bordeux przepraszam, mój błąd, nie uwzględniłem wartości true w drugim parametrze metody md5(), wszystko już działa, dziękuję serdecznie :) - yakuzafu 2016-03-24 20:46
jak działa to zaznacz poprawną odpowiedź jako poprawną (haczyk) :)) - bordeux 2016-03-26 00:05

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0