Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Dostęp do katalogu tylko ze skryptu php / jednorazowe linki
Forum PHP.pl > Forum > Przedszkole
dudek90
Witam,

Mam pytanie: Czy istnieje możliwość zablokowania dostępu z zewnątrz do katalogu na serwerze?
Chodzi mi o to aby po wpisaniu bezpośredniego adresu w przeglądarce nie było do tego folderu dostępu, natomiast aby skrypt PHP, który znajduje się na serwerze miał do tego folderu swobodny dostęp.

I jeszcze jedno pytanie:
Mam skrypt, który po zapłaceniu odpowiedniej kwoty przez dotpay wyświetla link do pobrania pliku na serwerze.
Chciałbym natomiast zrobić tak aby po zapłaceniu odpowiedniej kwoty tak jak dotychczas wyświetlał się ten link natomiast już po pobraniu pliku link by wygasał.
Podobnie jeśli ktoś nie dokonał opłaty a wkleił link do paska adresu w przeglądarce to aby link był niekatywny (w efekcie czego nie można było by pobrać pliku).

Jak takie coś rozwiązać ?

Za wszelką pomoc z góry dziękuję smile.gif
Monter08
Folder możesz zablokować poprzez htacces. A co do plików, to mógłbyś wykorzystać bazę danych i po prostu pobierać nazwę pliku i poprzez header() pobierać następnie usuwać rekord z bazy danych.
dudek90
Okej, zablokowałem dostęp do katalogu poprzez .htaccess natomiast niestety dostęp został zablokowany całkowicie.
To znaczy jeśli w skrypcie mam: header(Location: ....) i tu przekierowanie na dany plik z zablokowanego katalogu to niestety ale wyskakuje mi komunikat: Forbidden You don't have permission to access ....

Generalnie może jeszcze raz opiszę o co mi chodzi:

Mam katalog (powiedzmy, że nazywa się 'katalog') i w nim pliki: 'plik1', 'plik2', 'plik3'
W katalogu tym mam plik .htaccess o takiej treści:

  1. Order allow,deny
  2. Deny from all


Stworzyłem sobie testowy skrypt:
  1. <?php
  2.  
  3. if(isset($_POST['btn_pobierz']))
  4. {
  5. header("Location: http://".$_SERVER['HTTP_HOST'].rtrim(dirname($_SERVER['PHP_SELF']), '/\\')."/katalog/plik1");
  6. }
  7. ?>
  8. <html>
  9. <body>
  10. <form action="" method="post">
  11. <input type="submit" name="btn_pobierz" value="Pobierz" />
  12. </form>
  13. </body>
  14. </html>


Chodzi mi o to aby plik był otwierany tylko w momencie kliknięcia przycisku Pobierz.
To znaczy aby nie było do niego dostępu po bezpośrednim wpisaniu adresu do pliku w przeglądarkę.

Teraz jest tak, że gdy mam powyższy plik .htaccess to niestety ale przycisk pobierz nie działa (pojawia się komunikat, że brak dostępu) natomiast gdy nie mam .htaccess to plik można pobrać zarówno poprzez naciśnięcie przycisku pobierz jak i poprzez bezpośrednie wpisanie adresu do pliku w przeglądarkę.
Kużdo
Możesz skorzystać z mojego skryptu:
  1. <?php
  2. require_once 'db.php';
  3.  
  4. if(!isset($_GET['hash']) OR !preg_match('/^[a-f0-9]{32}$/', $_GET['hash']) OR !isset($_GET['id']) OR !preg_match('/^[0-9]+$/', $_GET['id']))
  5. {
  6. header('Location: ' . $settings['domain']);
  7. }
  8. elseif(isset($_GET['hash']) AND preg_match('/^[a-f0-9]{32}$/', $_GET['hash']) AND isset($_GET['id']) AND preg_match('/^[0-9]+$/', $_GET['id']))
  9. {
  10. $hash = $_GET['hash'];
  11. switch($_GET['id'])
  12. {
  13. case '1':
  14. $settings['pdf_name'] = '1pdf';
  15. $settings['pdf_path'] = 'sciezka/do/pliku/1pdf.pdf';
  16. break;
  17. case '2':
  18. $settings['pdf_name'] = '2pdf';
  19. $settings['pdf_path'] = 'sciezka/do/pliku/2pdf.pdf';
  20. break;
  21. case '3':
  22. $settings['pdf_name'] = '3pdf';
  23. $settings['pdf_path'] = 'sciezka/do/pliku/3pdf.pdf';
  24. break;
  25. case '4':
  26. $settings['pdf_name'] = '4pdf';
  27. $settings['pdf_path'] = 'sciezka/do/pliku/4pdf.pdf';
  28. break;
  29. case '5':
  30. $settings['pdf_name'] = '5pdf';
  31. $settings['pdf_path'] = 'sciezka/do/pliku/5pdf.pdf';
  32. break;
  33. default:
  34. $error = 'Nieprawidlowy link! Jesli nic nie zmieniales w adresie, to skorzystaj z formularza kontaktowego na stronie i poinformuj o bledzie Administratora.';
  35. break;
  36. }
  37. if(isset($error) AND $error != '')
  38. {
  39. exit($error);
  40. }
  41. $query = "SELECT `dodatki` FROM `" . PREFIX . "zamowienia` WHERE `control` = '{$hash}' LIMIT 1";
  42. $result = mysql_query($query);
  43. if(!mysql_num_rows($result))
  44. {
  45. exit('Nieprawidlowy link! Jesli nic nie zmieniales w adresie, to skorzystaj z formularza kontaktowego na stronie i poinformuj o bledzie Administratora.');
  46. }
  47. $row = mysql_fetch_array($result);
  48. if($row['dodatki'] < '10')
  49. {
  50. $ile = $row['dodatki'] + 1;
  51. $query = "UPDATE `" . PREFIX . "zamowienia` SET `dodatki` = '{$ile}' WHERE `control` = '{$hash}'";
  52. $result = mysql_query($query);
  53. {
  54. $name = basename($settings['pdf_path']);
  55.  
  56. $size = filesize($settings['pdf_path']);
  57.  
  58. header('Pragma: public');
  59. header('Pragma: no-cache');
  60. header('Expires: 0');
  61. header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
  62. header('Cache-Control: public ');
  63. header('Content-Description: File Transfer');
  64.  
  65. header('Content-Type: application/force-download');
  66.  
  67. header('Content-Disposition: attachment; filename="' . $settings['pdf_name'] . '.pdf"');
  68.  
  69. header('Content-Transfer-Encoding: binary');
  70. header('Content-Length: ' . $size);
  71.  
  72. readfile($settings['pdf_path']);
  73. }
  74. }
  75. else
  76. {
  77. exit("Nistety, ale wykorzystałeś swój limit pobierania.");
  78. }
  79. }
  80. ?>

Jest to wycinek całego skryptu, ale z pewnością wystarczy Ci do zastosowania u siebie. User nigdy nie pozna prawdziwej ścieżki do pliku, a Ty możesz generować mu nazwy plików dowolne, nie zmieniając przy tym nazwy prawdziwego pliku. Dodatkowo jest tu wymuszone pobieranie pliku, więc nie otworzy się on w przeglądarce. A nawet jeżeli otworzyłby się w przeglądarce, to link i tak nie będzie prawdziwy do pliku. Linki są generowane po zapłacie i wysyłane na maila do klienta, natomiast rozwiązać możesz to w dowolny sposób. Generować i wyświetlać, wysyłać, etc... Ważnym jest tylko to, aby linki (a w sumie sumy kontrolne) były generowane po poprawnej zapłacie (kod OK z dotpaya) i wtedy wysyłane/pokazywane klientowi. Link nawet gdyby został skopiowany, to po wykorzystaniu limitu jest bezużyteczny. W skrypcie też ustawiasz ile razy można pobrać plik, akurat tutaj wkleiłem Ci część od dodatków do głównego produktu i tutaj jest limit 10 pobrań na wszystkie łącznie dodatki, czyli jak pobierze 1 plik 10 razy, to żadnego innego już nie pobierze. Wyliczyć można łatwo, że można każdy plik pobrać 2 razy wink.gif 2 razy to limit zapasowy, gdyby np. klientowi padł net, przerwało się połączenie lub sam przypadkowo anulował pobieranie.
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.