Skrypt zabezpieczający pliki do pobrania na ftp przez token

0

Cześć!

Nie wiem czy jest to dobry dział, ale wydaj mi się że coś takiego powinno być w PHP napisane. Chciałbym sprzedawać pewne pliki w postaci spakowanych archiwów, które byłyby pobierane bezpośrednio z ftp. Każdy pojedynczy plik byłby w pojedynczym katalogu

adres.pl/katalog/pierwszy/1.zip
adres.pl/katalog/drugi/2.zip

Problem polega na tym że jak wszystkim kupującym udostępnię ten sam adres do pobrania, to zaraz pojawią się leecherzy i nie będzie dało się tego opanować, nie mówiąc o tym że ktoś adres może publicznie udostępnić. Kupujący muszą mieć stale dostęp do pliku, bo będą aktualizacje. Rozwiązaniem byłoby jakby każdy dostał unikatowy link z tokenem, do pobrania konkretnych plików:

adres.pl/6mtSeVCvpr kieruje do pliku adres.pl/katalog/pierwszy/1.zip
adres.pl/zSErhKZPRp kieruje do pliku adres.pl/katalog/drugi/2.zip

Ważne jest to żeby:

  • Oryginalna ścieżka do pliku była zabezpieczona i nie dało się jej podejrzeć
  • Wiele różnych tokenów mogło prowadzić do jednego pliku
  • Dało się zarządzać pojedynczym tokenem, w sensie ilość pobrań na dobę + ręczny ban w razie czego

Czy zna ktoś może takie gotowe rozwiązanie? Czy napisanie takiego skryptu jest możliwe, i czy jest to skomplikowane ? A może jest jakieś lepsze już rozwiązanie tego problemu?

Chciałbym się rozeznać zanim podejmę jakieś działania albo złożę zlecenie.

Pozdrawiam.

1

Nie znam żadnego gotowca, natomiast napisanie czegoś takiego we własnym zakresie nie jest wcale bardzo trudne.

Ja bym to zrobił poprzez wysłanie odpowiedniego headera oraz "wyplucie" pliku przez skrypt. Tylko nie wiem, jakiego rozmiaru te pliki chcesz mieć, bo obawiam się, że przy większych mogłoby to zbytnio obciążać serwer.

Opcja jeszcze jedna mi przyszła do głowy - na FTP zrobić sobie katalog z plikami "oryginalnymi", a potem tworzyć i udostępniać użytkownikom symlinki do tych plików - http://www.proftpd.org/docs/howto/Chroot.html

2

Również nie wiem jakiej wielkości miałyby być te pliki ale jak niezbyt duże to spróbowałbym w ten sposób (wersja z pamięci):

<?php
	$token = $_GET['token'] ?? 'none';
	if ($token == 'password')
	{
		header('Content-Disposition: attachment; filename="plik1.zip"');
		readfile('files/plik1.zip');
	}
	else
	{
		echo 'No access...';
	}
?>

Oczywiście w katalogu files znajdują się odpowiedni pliki i plik .htaccess, który ma ustawione DENY ALL :)

2

Wydaje mi się, że większym problemem będzie logika, bo czy link do pliku będzie wyglądał jak xyz.com/ajrhdyfbejddbdjfj czy xyz.com/file1.jpg, nie będzie miało znaczenia gdy użytkownik udostępni link.

Zatem jeśli problem polega na tym by nikt nie domyslil się pod jakimi url'ami są faktyczne pliki, to wystarczy generować losowy ciag znakow i np w bazie oznaczać, że prowadzi do takiego i takiego pliku.

Natomiast jeśli masz chronić przed wielokrotnym pobraniem, wtedy już by trzeba było generować nowy ciąg, za każdym odwiedzeniem poprzedniego czyli. Np raz dostajesz adres xyz.com/abcd, gdzie abcd w bazie wskazuje to np files/story.pdf I od chwili wejścia w link ustawiamy mu flagę visited na true. Jesli ktos ręcznie wklepie ten adres ponownie, to będzie miał info ze link błędny lub już wykorzystany.

Natomiast sam link o którym pisze, mógłbyś pozyskiwać ajaxem i robić na niego redirecta. Poza tym... W linku dawalbym jeszcze jakieś zakodowane id usera. Żebyś np mógł sprawdzić czy dany user nie próbuje Ci za dużo requestow wysyłać.
xyz.com/resources/ajsbsjfjfckrjritigjvjsje?id=fjfjrnxjritifcndjfutur
Gdzie ten ciąg w id mógłby wskazywać na jakiegoś usera. Jeśli tego ciągu nie będzie, nie pobieraj wcale pliku.

W razie czego możesz dawać też timestampy, czyli np dany link będzie ważny przez godzinę - ale to już w bazie trzymaj.

1

No dokładnie, to co podałem wyżej to tylko sposób samego działania. Od strony zabezpieczeń to pewnie postawiłbym na "przyjazne url'e" i przykładowo:
http://strona.pl/{user}/{token}
odnosiłaby się do pliku index.php?user=id_user&token=jakis_token :)

Ale to już kwestia tego w jaki sposób autor tematu chce to zabezpieczyć (czy ma już jakąś bazę, czy pliki te będą widoczne dopiero po zalogowaniu się itp.)

1

Co do wielokrotnego pobierana/udostępniania innym to można to obejść.

Ja bym zrobił tak, że sam link nie działa, jeśli nie jesteś zalogowany. Pojawia się w takim razie kwestia sesji i ich obsługi. Jeśli udostępnię komuś jedynie sam link, to on nic z nim nie zrobi, bo musi być zalogowany. W takim razie musiałby komuś udostępnić swój login i hasło - a na takie coś będzie mniej chętnych.

Poza tym można pilnować, żeby jednocześnie nie było kilku logowań na to samo konto. Można tez po IP badać, czy są to logowania z tego samego (albo np. 2-3) miejsc/urządzeń, czy najpierw plik pobiera koleś z Nowego Sącza, 3 minuty później z Ukrainy, a za pół godziny z Australii. Taka opcja będzie jednoznacznie wskazywać, że link krąży po świecie, więc wypadałoby go zablokować.

1

Zabierasz się do tego od złej strony, co z tego, że zabezpieczysz link skoro sam plik ktoś może po pobranie dalej wrzucić nawet na google driva i udostępnić dalej? Jeśli te pliki to jakieś kody wykonywalne to powinien powstać system licencji.

0

Dziękuję wam za odpowiedzi, mam już jakiś obraz jakby to miało wyglądać, widzę też że będzie mniej skomplikowane niż myślałem, teraz już na pewno wiem jak to ma działać.

Pliki są niewielkie, po kilka, kilkanaście MB, docelowo może być kilkaset sztuk. Użytkownik musi mieć niezmienny unikatowy link do każdego pliku, żeby mógł sobie co jakiś czas nowy pobrać z aktualizacją (nie chcę kupującym ciągle wysyłać nowych albo tworzyć jakiejś strony z logowaniem by generowali sobie to). Nie chcę za bardzo mówić co to za pliki, to jest dosyć specyficzna sytuacja, i o ile ktoś to pobierze i wrzuci plik na swojego dropboxa i będzie udostępniać to nie jest to dla mnie problem, bo bez aktualizacji nie pomoże mu to wiele. Musiałby ciągle ode mnie pobierać, kopiować, wstawiać znowu, itp. Ale jakby ktoś podlinkował plik bezpośrednio z mojego serwera który jest aktualizowany, i ludki różne by pobierały to już jest problem.

Właśnie też myślałem żeby może zrobić to przez jakąś bazę danych, żeby była pewność że nikt się nie dobierze do oryginalnej ścieżki, ale łatwiej chyba w excel generować te tokeny odpowiednio, z przypisanymi ścieżkami, i wstawić do jakiegoś pliku php który będzie robić za bazę danych, tzn. jak mi się skończą tokeny to będę doklejać nowe. Ok jeszcze raz dziękuję za odpowiedzi, pewnie tego nie ogarnę sam więc zlecę to za jakiś czas w dziale ogłoszenia. Pozdrawiam.

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