Czy można umieścić dane binarne obrazu w znacznikach html, a następnie uzyskać obraz wyświetlany jak zwykle w dowolnej przeglądarce?

To ważna kwestia bezpieczeństwa i jestem pewien, że to powinno być możliwe.

Prosty przykład:

Prowadzisz portal społecznościowy. Użytkownicy są zarejestrowani i przesyłają swoje zdjęcia. Aplikacja podaje reguły bezpieczeństwa, gdy tylko obraz może być wyświetlany. Na przykład użytkownicy muszą być znajomymi z każdej strony systemu, aby móc oglądać przesłane zdjęcia innych osób.

Pojawia się problem: możliwe, że ktoś indeksuje katalogi obrazów twojego serwera. Ale chcesz chronić swoich użytkowników przed takimi atakami.

Jeśli możliwe jest umieszczenie danych binarnych obrazu bezpośrednio w znacznikach HTML, możesz ograniczyć dostęp Użytkownika do obrazów dirs do użytkownika i grupować biegi aplikacji sieci web i przekazywać dane obrazu do użytkownika Apache i grupy bezpośrednio w HTML.

Jedyną możliwą wadą jest hasło użytkownika, jako którego działa Twoja aplikacja internetowa.

Czy jest już taka możliwość?

Author: Joern Akkermann, 2010-03-12

5 answers

Istnieją inne (lepsze) sposoby, opisane w innych odpowiedziach, aby zabezpieczyć pliki, ale tak, możliwe jest osadzenie obrazu w html.

Użyj znacznika <img> w ten sposób:

<img src="data:image/gif;base64,xxxxxxxxxxxxx...">

Gdzie xxxxx... część jest kodowaniem base64 danych obrazu gif.

 70
Author: bmb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-12 05:41:32

Gdybym potrzebował zabezpieczeń w moim katalogu obrazów, w ogóle bym go nie ujawnił. Zamiast tego moje atrybuty img src odwołują się do strony, która przyjmuje identyfikator użytkownika i ID obrazu jako parametr.

Strona potwierdzi, że użytkownik rzeczywiście miał dostęp do tego zdjęcia. Jeśli wszystko jest dobre, odeślij plik binarny. W przeciwnym razie nic nie wysyłaj.

Na przykład:

<img src="imgaccess.php?userid=1111&imgid=223423" />

Poza tym, nie używałbym domyślnych identyfikatorów. zamiast trzymać się czegoś takiego jak Baza 64 zakodowana guid ' s.

 11
Author: NotMe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-12 01:38:19

Nie jestem pewien, czy rozumiem, ale zaczyna się. Zamiast serwować statyczne obrazy znajdujące się w folderze obrazów - dlaczego przy użyciu wybranej technologii po stronie serwera obrazy nie mogły być dynamicznie wysyłane do klienta? W ten sposób Twój kod po stronie serwera może dostać się do mieszanki i zezwolić lub odmówić dostępu programowo?

<img src="/images/getImage.aspx?id=123353 />
 3
Author: Eric,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-12 01:40:00

W HTML5 możesz użyć znacznika canvas i JavaScript, aby to zrobić.

Mógłbyś zrobić coś za pomocą CSS lub układu tabeli, aby narysować obraz (prawdopodobnie naprawdę zła wydajność, rozdzielczość, przenośność).

Tak czy inaczej, nikt nie powstrzyma ludzi przed robieniem Twoich zdjęć. Mogliby zrobić zrzut ekranu i go przyciąć.

Jak Chris wspomniał w swojej odpowiedzi, posiadanie długiego identyfikatora obrazu tak, że adres URL dla każdego obrazu nie jest łatwy do odgadnięcia lub brute force jest ważne. I nie ma listy katalogów w katalogach serwera www jest również.

 0
Author: Sean A.O. Harney,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-12 01:43:45

Możesz przenieść zdjęcia z katalogu głównego dokumentu do prywatnego katalogu i dostarczyć je za pośrednictwem aplikacji, która ma dostęp do tego katalogu. Za każdym razem, gdy aplikacja generuje znacznik obrazu, generuje również krótkotrwały token bezpieczeństwa, który musi być określony podczas uzyskiwania dostępu do określonego obrazu:

<img src="/app/getImage.xyz?image=12345&token=12a342e32b321" />

Szanse są bardzo rzadkie, że ktoś brutalnie wymusi odpowiedni token we właściwym czasie z właściwym obrazem. Jest co najmniej do możliwości weryfikacji token w "getImage":

  1. Śledź wszystkie znaczniki obrazów w aplikacji i przechowuj rekordy w bazie danych, która łączy losowo wygenerowane tokeny i identyfikatory obrazów z żądanymi użytkownikami. Następnie akcja "getImage" sprawdza dostarczone parametry względem tej bazy danych.
  2. Wygeneruj token jako sumę kontrolną (MD5, CRC, cokolwiek) nad identyfikatorem użytkownika, identyfikatorem obrazu i być może aktualnym dniem roku, i pamiętaj, aby zmieszać w niezauważalnej soli. Akcja "getImage" przeliczy następnie sumę kontrolną und sprawdzić go z podanym w celu sprawdzenia dostępu użytkownika. Ta metoda przyniesie mniej kosztów ogólnych niż pierwsza.

Przykład PHP:

$token = md5($_SESSION['user_id'].' '.$imageID.' '.$SECRET_SALT.' '.date('z'));
 0
Author: the-banana-king,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-12 02:02:31