Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP]Dostęp do katalogu tylko ze skryptu php / jednorazowe linki
dudek90
post
Post #1





Grupa: Zarejestrowani
Postów: 44
Pomógł: 0
Dołączył: 18.07.2011

Ostrzeżenie: (0%)
-----


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ę (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 3)
Monter08
post
Post #2





Grupa: Zarejestrowani
Postów: 237
Pomógł: 22
Dołączył: 16.09.2010
Skąd: Lubaczów

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
dudek90
post
Post #3





Grupa: Zarejestrowani
Postów: 44
Pomógł: 0
Dołączył: 18.07.2011

Ostrzeżenie: (0%)
-----


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ę.

Ten post edytował dudek90 2.05.2012, 12:06:20
Go to the top of the page
+Quote Post
Kużdo
post
Post #4





Grupa: Zarejestrowani
Postów: 181
Pomógł: 14
Dołączył: 4.06.2008

Ostrzeżenie: (0%)
-----


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 (IMG:style_emoticons/default/wink.gif) 2 razy to limit zapasowy, gdyby np. klientowi padł net, przerwało się połączenie lub sam przypadkowo anulował pobieranie.

Ten post edytował Kużdo 2.05.2012, 13:43:37
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 21.12.2025 - 18:56