Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][AJAX] blokada bezpośredniego wywołania pliku
Forum PHP.pl > Forum > Przedszkole
!*!
W pliku index.php odczytuję za pomocą ajaxa plik test.php, jednak chciałbym aby plik test.php był tylko dostępny z poziomu zalogowania/pliku index.php, tak aby nie można było odczytać go dając bezpośrednią ścieżkę do niego.

Po przczytaniu kilku postów myślałem o tokenie w sesji... ale to też mija sie z celem, skoro odpalę index.php który wygeneruje token, a plik test.php ma go sprawdzić to co za różnica czy sprawdzę go w index.php czy bezpośrednio się do niego odwołując, to żadne zabezpieczenie, bo sesja będzie już istnieć.
kornel-php
Hmm, może pobranie do zmiennej ścieżki do otwartego pliku i sprawdzenie, czy nie jest to "test.php"...

  1. <?php
  2.  
  3. $adres = $_SERVER['PHP_SELF'];
  4.  
  5. if(eregi('test.php', $adres)) { // uczyń coś;
  6.  
  7. }
  8.  
  9. ?>


O ile dobrze zrozumiałem istotę problemu...
wookieb
Zainteresuj się
  1. <?php
  2. echo $_SERVER['HTTP_REFERRER'];
  3. ?>
!*!
kornel-php - w pliku który jest wczytywany przez ajax to nie działa. Ponieważ plik wczytywany jest "bezpośrednio".

wookieb - referrer można podmienić choćby w curlu.
erix
~wookieb, do tego pomyliłeś klucz. ;d

Cytat
jednak chciałbym aby plik test.php był tylko dostępny z poziomu zalogowania/pliku index.php, tak aby nie można było odczytać go dając bezpośrednią ścieżkę do niego.

Niby czemu? Sprawdzanie sesji by nie wystarczyło?
!*!
erix - sesja trwa w obrębie przeglądarki tak? Chciałbym plik test.php wczytywać tylko poprzez plik index.php i nigdzie więcej. Co z tego że ustawię sprawdzanie sesji, skoro wywołam plik test.php bezpośrednio w adresie i sesja będzie się zgadzała. Pamiętajcie że chodzi o ajax.

EDIT:

A $_SERVER['REQUEST_URI']; ? Można jakoś wysłać curlem bądź podmienić? mógłbym wtedy sprawdzić czy ... heh w zasadzie to już nie wiem...
erix
No w obrębie przeglądarki. Ale tylko dla danej domeny przecież. Nadal nie rozumiem, po co tak kombinujesz...
!*!
Ponieważ po zalogowaniu do profilu użytkownik pobiera swoje dane... niezbyt profesjonalnie wygląda opcja odczytu ich przez wczytanie bezpośredniego pliku który za to odpowiada.
zegarek84
Cytat(wookieb @ 14.07.2009, 22:48:58 ) *
Zainteresuj się
  1. <?php
  2. echo $_SERVER['HTTP_REFERRER'];
  3. ?>

Cytat(!*! @ 14.07.2009, 23:47:30 ) *
wookieb - referrer można podmienić choćby w curlu.

tak jak każdy inny parametr więdząc uprzednio co jest wysyłane - a sprawdzić to można przy pomocy live http headers ;)
Cytat(!*! @ 15.07.2009, 01:10:42 ) *
Ponieważ po zalogowaniu do profilu użytkownik pobiera swoje dane... niezbyt profesjonalnie wygląda opcja odczytu ich przez wczytanie bezpośredniego pliku który za to odpowiada.

jeśli ktoś wpisuje adres z "palca" to nie ma wtedy referera...

jednak aby dane były dostępne tylko dla konkretnego zalogowanego urzytkownika (mniejsza z tym czy on umie też z curla kożystać jeśli do tego się posłuży swoimi danymi - pozatym nie da się schować coś co chcesz pokazać - jedynie możesz tylko utrudnić - nic więcej...) - gdyż wysyłać możesz też w zależności ktury to urzytkownik to wysylaj też sesję jego zalogowania w przeglądarce - nie twórz dodatkowych bo szkoda zabawy... dane najlepiej wysyłaj metodą post... przy okazji w tablicy $_SERVER sprawdź jeszcze jaką metodą przyszło zapytanie ('REQUEST_METHOD')... jak już pisałem wysyłając postem sesję to jeśli ktoś ręcznie wpisze adres to już jakieś zabezpieczenie...

dodatkowo możesz sprawdzać jeśli nie chcesz aby jakichś danych nie hotlinkowali np. obrazków i nie otwierali w nowych kartach to czy zawsze jest referer i czy:
Kod
(parse_url($_SERVER['HTTP_REFERER'], PHP_URL_HOST)==$_SERVER['SERVER_NAME'])

ale to tez może posłużyć jako dodatkowe zabezpieczenie do skryptu ajax...
co do 'REQUEST_URI' o które się pytałeś to w zasadzie masz to też w refererze ;)

ogólnie możesz pododawac tych argumentów ale dla kogoś wprawnego nie będzie problemu z przejrzeniem tego w curl'u - jednak przejrzy tylko swoje dane - a przy wpisaniu adresu z palca to mu już nie wyjdzie ;)

ps. są też inne funkcji niż curl gdzie można wysłać nagłówki rządania ;)
kipero
Niektóre firewalle blokują wysyłanie REFERERa. Co w takim wypadku?
wookieb
A czy powiedziałem, że jest to zabezpieczenie w 100% bezpieczne? ŻADNE ale to ŻADNE zabezpieczenie nigdy nie bedzie w 100% zapewniało bezpieczeństwa i zawsze plik będzie mozna wywołac bezpośrednio stosując odpowiednie techniki.

A jeżeli chodzi o sprawdzenie zalogowania to tylko sesje i to byłby koniec tematu.
!*!
Masz racje wookieb, ale w samym php był choćby prosty myk że w pliku index dawałeś zmienną [token], w includowanym pliku sprawdzałeś czy istnieje, jeśli nie exit. Z ajaxem nie ma tego zastsosowania bo każdy plik jest wczytywany na nowo a nie "we wewnątrz"
zegarek84
Cytat(kipero @ 15.07.2009, 07:27:00 ) *
Niektóre firewalle blokują wysyłanie REFERERa. Co w takim wypadku?

podaj przykład - aż sprawdzę - by6łem pewien że całe zapytanie było wysyłąne na tym samym porcie ;p - a na fiirewall'u można blokować porty i kierunek wyjścia - oraz gdzie tongue.gif - jednak nie przypominam sobie, żeby filtrowało treść ;p
Cytat(!*! @ 15.07.2009, 11:41:33 ) *
Masz racje wookieb, ale w samym php był choćby prosty myk że w pliku index dawałeś zmienną [token], w includowanym pliku sprawdzałeś czy istnieje, jeśli nie exit. Z ajaxem nie ma tego zastsosowania bo każdy plik jest wczytywany na nowo a nie "we wewnątrz"

co z tego - ten takzwany token nie pamiętam czy np. cookies są wysyłąne automatycznie z ajaxem - podałem narzędzie do sprawdzenia - to samą sesję możesz traktować jako Twój token ;p - nie przesadzaj z zabezpieczeniami a skup sie na krytycznych błedach ;p... i tu właśnie w pliku który wywołujesz ajaxem tez treśc możesz zmienać w zqależności od zmiennych post i zmiennych get - lub nagłówków przeglądarki - więc czemu piszesz, że nie da się sprawdzić Twojego tokena?? - inna sprawa, że nie wiem jak to dokłądnie rozwiązałeś ;p
erix
Filtruje nagłówki. Firewalle najczęściej są dołączone do pakietów "Internet Security", produkty Symanteca chyba wycinają, Steganos też.
!*!
zegarek84 - może i będę upierdliwy ale wolę to obgadać, w końcu co dwie głowy to nie jedna.

Wykorzystuję bibliotekę mintajax, przykładowo odwołuję się do pliku który dałem jako RR:

Kod
...
var tabs = mint.gui.CreateTabWidget("wyswietltu");
tabs.AddItem("start", "start", "text", "[b]start20[/b]");
...


gdzie start20 to RR wiodący do pliku test.php a sam RR wygląda tak:

Kod
RewriteRule ^(start20)$ /katalog/start.php [L]


w pliku index.php klikam w link który odwołuje się do start20 tymsamym zawartość pliku test.php jest wczytywana do diva wyswietltu i to mi odpowiada. Ale, pogubiłem się bo nie wiem czy i jak to zabezpieczyć, bo jeśli wpiszę httpL//domena/start20 to plik zostanie wyświetlony bezpośrednio. Wyświetlając go sprawdzam sesję, więc ktoś kto nie jest zalogowany, bądź ma inną nie zobaczy nic innego, ale nie jestem przekonany czy takie wyświetlanie danych... No nie wyglada to zbyt dobrze. Dlatego zastanawiam się jak to zapezpieczyć?

Przy wersji z samym PHP robiłem na zasadzie zmiennej która była odczytywana getem po kliknięciu na linkt, od zawartości geta zmieniała się zawartość wczytywanego pliku. A jak to zrobić przy pomocy ajaxa? Chyba za bardzo nie rozumiem działania jego mechanizmu jeszcze.
erix
Cytat
Przy wersji z samym PHP robiłem na zasadzie zmiennej która była odczytywana getem po kliknięciu na linkt, od zawartości geta zmieniała się zawartość wczytywanego pliku. A jak to zrobić przy pomocy ajaxa?

Przecież AJAX, to to samo, jak poprzednie wywołanie... Tylko jakby innym klientem. [;
!*!
W wersji PHP było to na takiej zasadzie
  1. <?php
  2.  
  3. if(zabezpieczgetpost($_GET["cos"]) == 'start') { include('go/startmenu.php');}
  4. else if(zabezpieczgetpost($_GET["cos"]) == 'mail') { include('go/mail.php');}
  5.  
  6. else if(!isset($_GET["cos"])) { include("go/startmenu.php");}
  7. else {  header('Location: http://'.$_SERVER['SERVER_NAME']./}
  8. ?>


Wtedy link wyglądałm mniej więcej http://domena/index-start lub http://deomena/index?cos=start itp.

Ale nie mam pojęcia jak odwołać się do tego ajaxem ...
Fifi209
W wersji PHP wyglądałoby to raczej tak:

index.php

  1. <?php
  2. define('site', TRUE);
  3.  
  4. include('test.php');
  5. ?>


test.php

  1. <?php
  2. if (site === true) {
  3.  
  4. // kod strony/skryptu
  5.  
  6. }else{
  7.  
  8. // wyświetlenie błędu
  9. }
  10. ?>
!*!
Można i tak, co nie zmienia faktu że przy ajaxie jeśli w index dam define to plik załadowany przez ajax już nie odczyta tego z index.php
Fifi209
Cytat(!*! @ 16.07.2009, 13:48:22 ) *
Można i tak, co nie zmienia faktu że przy ajaxie jeśli w index dam define to plik załadowany przez ajax już nie odczyta tego z index.php


A no nie, ja dałem przykład dla PHP. ;)

Generuj jakiś kod ajax'em i po stronie php go sprawdzaj. I np. kod działa przez 10 minut etc. różne są pomysły i rozwiązania.
!*!
Ale to i tak mija się z celem, bo plik nadal będzie można odczytać bezpośrednio smile.gif heh ten ajax w cale taki rewelacyjny nie jest.
Fifi209
Cytat(!*! @ 16.07.2009, 13:58:24 ) *
Ale to i tak mija się z celem, bo plik nadal będzie można odczytać bezpośrednio smile.gif heh ten ajax w cale taki rewelacyjny nie jest.


Ale zawsze jest trudniej, bo trzeba najpierw odnaleźć kod w skrypcie i odpowiednio go przesłać do pliku php
!*!
Nie będzie trudniej bo kod JS jest jawnie widoczny i raczej nie ma problemu z odczytaniem gdzie prowadzi link/RR.
Fifi209
Cytat(!*! @ 16.07.2009, 14:12:33 ) *
Nie będzie trudniej bo kod JS jest jawnie widoczny i raczej nie ma problemu z odczytaniem gdzie prowadzi link/RR.


Przesyłasz do skryptu np. postem te dane? smile.gif
I już koleś musi sobie zrobić formularz aby podejrzeć głupi plik.
erix
Cytat
heh ten ajax w cale taki rewelacyjny nie jest.

A w jaki inny sposób to sobie wyobrażałeś? tongue.gif

To tak jakby "przeglądarka", tylko sterowana przez JS, reguły wciąż obowiązują te same.
!*!
Nie, getem, w mintajaxie nie można ich przesłać postem. przynajmniej przykłady w dokumentacji nie działają, choć muszę to obadać raz jeszcze bo coś mam wrażenie że to nie możliwe i pewnie coś źle robię... Chociaż nawet gdy pozmieniałem wszytko na

Kod
req.method="post";


to i tak po sprawdzeniu było jako GET.
Fifi209
Cytat(!*! @ 16.07.2009, 14:16:06 ) *
Nie, getem, w mintajaxie nie można ich przesłać postem. przynajmniej przykłady w dokumentacji nie działają, choć muszę to obadać raz jeszcze bo coś mam wrażenie że to nie możliwe... Chociaż nawet gdy pozmieniałem wszytko na

Kod
req.method="post";


to i tak po sprawdzeniu było jako GET.


Ja używam jQuery i nie mam żadnych problemów z ajax'em.
!*!
jQuery jak dla mnie jest zbyt toporny i trudny do opanowania, jakoś nie mogę się na niego przedstawić, poza tym jest nadal za mało opisanych podstaw.
Fifi209
Cytat(!*! @ 16.07.2009, 14:51:35 ) *
jQuery jak dla mnie jest zbyt toporny i trudny do opanowania, jakoś nie mogę się na niego przedstawić, poza tym jest nadal za mało opisanych podstaw.


Słabo szukać, dobre artykuły znajdziesz nawet w języku polskim.

http://ferrante.pl/category/tech/jquery/
!*!
Czytałem to jednak nadal za mało przyjazne, pozostanę przy mincie. Zresztą, nie odbiegajmy od tematu.
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.