Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [HTML][PHP]Ukrywanie URL do plików z zewnętrznych serwerów
Forum PHP.pl > Forum > Przedszkole
przemekfilu
Witam,

Szukałem sporo na temat ukrywania URL downloadu, głównie w języku angielskim. Znalazłem ogrom skryptów, niestety, albo były typowo pod jeden plik lub jeden folder, albo nie były do końca wyjaśnione i nie byłem w stanie ich zrozumieć. Dodatkowo wszystko z około 2006 roku dlatego głupio by mi było odkopywać tamte tematy.

Głównym problemem w moim przypadku są serwery... Nie posiadam jednakowego folderu dla wszystkich plików. Korzystam z darmowych hostingów, więc niedość, że mają one często dziwne linki download (hotlink) to jeszcze nazwa często jest 50cio kilometrowa - randomowa i to właśnie chcę ukryć. Osoba ma mieć możliwość pobrania pliku, a nie mieć możliwości znalezienia hostu (często programy wspomagające pobieranie widzą url).

Moja strona w przykładzie wygląda nastepująco:

Wybieramy z menu film, przenosi to nas do strony głównej tego filmu np example.com/film1/index.php i tu widzimy liste plikow do pobrania np. scena1, scena2, scena3

Chciałem to zrobić w html'u, niestety mogę tam tylko wprowadzić nazwę pliku poprzez: <a href="xyzhost.abc/qwerty123.mp4" download="Scena1.mp4">Scena 1</a>

Chciałbym to zrobić dla każdego filmu osobno np /film1/download.php i w tym pliku dodać każdy z linków dla scen z filmu1. W /film2/download.php znów osobno powklejam linki dla scen z filmu2. chyba, ze można by to zrobić dla większej ilości tj:

Index > Kategoria > Film > Sceny

Czyli jeden plik download w kategorii i tam linki dla scen z film1, film2 i film3. To jeszcze bardziej zmniejszyłoby mi czas potrzebny do edytowania linkow w przyszłości.

Znalazłem oto taki kod:

get.php:
  1. <?
  2.  
  3. $id = $_GET['id'];
  4.  
  5. if ($id = "1") {
  6. $filename = "file1.mp3";
  7. }
  8.  
  9. if ($id = "2") {
  10. $filename = "file2.mp3";
  11. }
  12.  
  13. if ($id = "3") {
  14. $filename = "file3.mp3";
  15. }
  16.  
  17. if ($id = "4") {
  18. $filename = "file4.mp3";
  19. }
  20.  
  21. $conttype = mime_content_type($filename);
  22.  
  23. $content_len=@filesize($filename);
  24. Header("Content-type: ".$conttype);
  25. Header("Content-type: octet-stream");
  26. Header('Content-Disposition: attachment; filename=$filename');
  27. if($content_len!=FALSE)
  28. {
  29. Header("Content-length: $content_len");
  30. }
  31. readfile($filename);
  32. ?>


I linki dla pliku:

  1. <a href="get.php?id=1">File 1</a>
  2. ...
  3. <a href="get.php?id=4">File 4</a>


I takie coś w sumie by mnie zadowoliło, ale nie wiem czy ten skrypt jest poprawny i czy schowa linki dla download menagerów. W następnym poscie osoba, który go napisała, powiedziała, żeby osoba, której pomagal nie używała go bo coś tam jest źle. I po kolejnym czasie dodał kolejnego posta z poprawionym kodem, niestety, poprawiony skrypt miał już możliwość dodania tylko i wyłącznie folderu wszystkich plików...
zegarek84
przynajmniej wstawiłeś kod w bbcode... co jest źle?? trochę zależy od tego co autor miał an myśli... ale z linku readfile masz niemal identyczny kod - poszukaj różnicy i gdzie może być błąd w skrypcie - z tego co na szybko po paru głębszych widzę to w nazwie plików... ale dalej popracuj nad logiką aplikacji... nawet jakbyś wszystko miał nie w prost w kodzie a generowane przez JavaScript to to nie jest żaden problem nawet przy rozbudowanym i zakodowanym JS gdyż wersja łatwiejsza dla obchodzącego stronę - pisze plugin do przeglądarki i komunikuje się z serwerem... dla kogoś co wie coś więcej korzysta z przeglądarki w danym języku obsługującej JS i robi co chce (np. C++ Qt webkit itp.... itd... i ostatnio popularny Node.JS skoro korzysta z silnika przeglądarki to i może w nim można udawać przeglądarkę w pełni tego słowa znaczeniu...)...


raczej popracuj nad tym, kto te dane już może zobaczyć...

a jeśli już tak mocno chcesz iść w ukrywanie kodu to nie pisz linków jako tekst tylko canvas, kod JS na stronie bez zewnętrznych/globalnych zmiennych i wszystko na socketach lub łatwiejsze do odczytania chociaż AJAX po jakiejś komunikacji - ale dalej jak sobie to rozplanujesz bo wszystko da się "debugować" więc przede wszystkim skup się na logice aplikacji i kto faktycznie może to obejrzeć...

ps. może ktoś komu np. załadował się jakiś obrazek w tle (np. CSS) który może być wysyłany przez serwer w sesji czy inne nie elementy nie wydające się istotne które można zapisać w sesji... ale jeśli ktoś skorzysta z pluginów do przeglądarek lub np. C++ Qt webkit na podglądzie to i tak nic to nie da ;]...
KsaR
Ogolem to uzywaj isset aby sprawdzic czy indeks id w $_GET istnieje

Uzywaj <?php zamiast <? (Unikniesz sporo problemow / zaleznie od konfiguracji serwera i wersji php)

  1. if ($id = "1") {
  2. $filename = "file1.mp3";
  3. }


To jest nie poprawne.
Jako ze uzyles = zamiast == lub ===
Przez co utworzyles zmienna $id z wartoscia 1 ktora ostatecznie zwroci w warunku prawdę. I ten if się wykona, analogicznie reszta.
Jako ze uzyles if...if.. zamiast if...elseif..else lub switch, wykona sie kazdy if po kolei zamiast np. Pierwszy, tak wiec ostatecznie jak zrobisz w lini 20 echo $filename; powinno tobie pokazac zawsze file4.mp3

Gdy to wszystko poprawisz powinno juz pokazywac patch wybrany przez ciebie zamiast bezwzgledny.
Co do pierwszego masz tu przykładową poprawkę:
  1. $id = (int)$_GET['id'] questionmark.gif 0; // dla php w wersji 7+
  2. $id = isset($_GET['id']) ? (int)$_GET['id'] : 0; // dla starszych




przemekfilu
Dziękuje za odpowiedzi...

Co do skryptu to skopiowałem go tak jak napisał go autor dla tamtego użytkownika i chciałem się dowiedzieć czy, aby napewno jest poprawny. Stąd te ".mp3"

Jak wspomniałem, później autor poprawiał się... Cytując co zrobił źle wg niego:

Cytat
mime_content_type($filename); doesn't work, for some odd reason. So once I worked around that, it wouldn't recognize the different file names.

Cytat
I did some googling, checking my steps, and I realized I used all if statements instead if one if and the rest elseif and it still wouldn't work.


Także @KsaR dobrze zauważyłeś... Nie bez powodu wysłałem też posta w dziale 'Przedszkole'... Prosiłbym o pomoc jak to w końcu DOBRZE miałoby wyglądać. Tak, jestem zielony.

A tak wyglądał poprawiony kod, który już odnosi się do katalogu, dlatego też mnie nie interesuje:
  1. <?
  2.  
  3. $id = $_GET['id'];
  4.  
  5. $filename = "download/file_".$id.".mp3";
  6.  
  7. header("Content-disposition: attachment; filename=".$filename."");
  8.  
  9. header('Content-type: application/octet-stream');
  10.  
  11. readfile($filename);
  12.  
  13. ?>


Kontynuując i poprawiając skrypt w mój zielony sposób, to miało by to wyglądać tak?:

  1. <?php
  2.  
  3. $id = isset($_GET['id']) ? (int)$_GET['id'] : 0;
  4.  
  5. if ($id = "1") {
  6. $filename = "file1.mp4";
  7. }
  8.  
  9. elseif ($id = "2") {
  10. $filename = "file2.mp4";
  11. }
  12.  
  13. elseif ($id = "3") {
  14. $filename = "file3.flv";
  15. }
  16.  
  17. elseif ($id = "4") {
  18. $filename = "file4.flv";
  19. }
  20.  
  21. $conttype = mime_content_type($filename);
  22.  
  23. $content_len=@filesize($filename);
  24. Header("Content-type: ".$conttype);
  25. Header("Content-type: octet-stream");
  26. Header('Content-Disposition: attachment; filename=$filename');
  27. if($content_len!=FALSE)
  28. {
  29. Header("Content-length: $content_len");
  30. }
  31. readfile($filename);
  32. ?>


Jeszcze raz dziękuje za odpowiedzi.
KsaR
"$id ="
Dodaj jedno = wiecej, zeby "porownac wartosci" a nie "przypisac do zmiennej $id wartosc"
Warto tez dodac else za ostatnim elseif w razie gdy zaden warunek sie nie spelni to cos zrobic..
Np. Skrypt zatrzymac czy cos (przez exit(); )
przemekfilu
Nie do końca wiem jak to zrobić...

  1. <?php
  2.  
  3. $id == isset($_GET['id']) ? (int)$_GET['id'] : 0;
  4.  
  5. if ($id = "1") {
  6. $filename = "file1.mp4";
  7. }
  8.  
  9. elseif ($id = "2") {
  10. $filename = "file2.mp4";
  11. }
  12.  
  13. elseif ($id = "3") {
  14. $filename = "file3.flv";
  15. }
  16.  
  17. elseif ($id = "4") {
  18. $filename = "file4.flv";
  19. }
  20.  
  21. else exit();
  22.  
  23. $conttype = mime_content_type($filename);
  24.  
  25. $content_len=@filesize($filename);
  26. Header("Content-type: ".$conttype);
  27. Header("Content-type: octet-stream");
  28. Header('Content-Disposition: attachment; filename=$filename');
  29. if($content_len!=FALSE)
  30. {
  31. Header("Content-length: $content_len");
  32. }
  33. readfile($filename);
  34. ?>



EDIT:

Także sprawdziłem ten oto skrypt i przy naciśnięciu na download dostawałem error dot.
  1. $conttype = mime_content_type($filename);

Poszukałem w necie i NIE WIEM CZY DOBRZE, ale zmieniłem swój skrypt na takowy:

  1. <?php
  2.  
  3. $id == isset($_GET['id']) ? (int)$_GET['id'] : 0;
  4.  
  5. if ($id = "1") {
  6. $filename = "file1.mp4";
  7. }
  8.  
  9. elseif ($id = "2") {
  10. $filename = "http://jakistamserw.pl/file1.mp4";
  11. }
  12.  
  13. elseif ($id = "3") {
  14. $filename = "file3.flv";
  15. }
  16.  
  17. elseif ($id = "4") {
  18. $filename = "file4.flv";
  19. }
  20.  
  21. else exit();
  22.  
  23.  
  24. function r19mime($x) {
  25. if (defined(FILEINFO_MIME_TYPE)&&($t=new finfo(FILEINFO_MIME_TYPE))) $m=$t->file($url);
  26. else if (function_exists('mime_content_type')) $conttype=mime_content_type($url);
  27. if (!$conttype) {
  28. $mime_types=array(
  29. 'txt' => 'text/plain',
  30. 'htm' => 'text/html',
  31. 'html' => 'text/html',
  32. 'php' => 'text/html',
  33. 'css' => 'text/css',
  34. 'js' => 'application/javascript',
  35. 'json' => 'application/json',
  36. 'xml' => 'application/xml',
  37. 'swf' => 'application/x-shockwave-flash',
  38. 'flv' => 'video/x-flv',
  39. // images
  40. 'png' => 'image/png',
  41. 'jpe' => 'image/jpeg',
  42. 'jpeg' => 'image/jpeg',
  43. 'jpg' => 'image/jpeg',
  44. 'gif' => 'image/gif',
  45. 'bmp' => 'image/bmp',
  46. 'ico' => 'image/vnd.microsoft.icon',
  47. 'tiff' => 'image/tiff',
  48. 'tif' => 'image/tiff',
  49. 'svg' => 'image/svg+xml',
  50. 'svgz' => 'image/svg+xml',
  51. // archives
  52. 'zip' => 'application/zip',
  53. 'rar' => 'application/x-rar-compressed',
  54. 'exe' => 'application/x-msdownload',
  55. 'msi' => 'application/x-msdownload',
  56. 'cab' => 'application/vnd.ms-cab-compressed',
  57. // audio/video
  58. 'mp3' => 'audio/mpeg',
  59. 'mp4' => 'audio/mpeg',
  60. 'qt' => 'video/quicktime',
  61. 'mov' => 'video/quicktime',
  62. // adobe
  63. 'pdf' => 'application/pdf',
  64. 'psd' => 'image/vnd.adobe.photoshop',
  65. 'ai' => 'application/postscript',
  66. 'eps' => 'application/postscript',
  67. 'ps' => 'application/postscript',
  68. // ms office
  69. 'doc' => 'application/msword',
  70. 'rtf' => 'application/rtf',
  71. 'xls' => 'application/vnd.ms-excel',
  72. 'ppt' => 'application/vnd.ms-powerpoint',
  73. // open office
  74. 'odt' => 'application/vnd.oasis.opendocument.text',
  75. 'ods' => 'application/vnd.oasis.opendocument.spreadsheet',
  76. );
  77. $ext=strtolower(array_pop(explode('.',$url)));
  78. if (array_key_exists($ext,$mime_types)) $conttype=$mime_types[$ext];
  79. else $conttype='application/octet-stream';
  80. } return $conttype;
  81. }
  82.  
  83.  
  84. $content_len=@filesize($filename);
  85. Header("Content-type: ".$conttype);
  86. Header("Content-type: octet-stream");
  87. Header('Content-Disposition: attachment; filename=$filename');
  88. if($content_len!=FALSE)
  89. {
  90. Header("Content-length: $content_len");
  91. }
  92. readfile($filename);
  93. ?>


Ten skrypt pobiera mi plik "$filename", a w nim:

  1. <br />
  2. <b>Warning</b>: readfile(file1.mp4) [<a href='function.readfile'>function.readfile</a>]: failed to open stream: No such file or directory in <b>/home/test/domains/test.pl/public_html/abc/get.php</b> on line <b>92</b><br />
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.