Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [AJAX][PHP] Plik ma działać tylko gdy jest wczytany JSem
Forum PHP.pl > Forum > Przedszkole
ArekJ
Witam.
Mam taki problem, on w sumie szczególnego zagrożenia nie stwarza, jednak wolałbym tą możliwość wyeliminować.
Otóż wczytuję wartość pliku /ajax/X.php za pomocą AJAXa. Tutaj wszystko działa jak należy itp, ale istnieje możliwość otworzenia pliku /ajax/X.php wpisując go w adresie przeglądarki. Chciałbym, aby plik mógł się wykonywać tylko w momencie, kiedy jest on wczytywany za pomocą AJAXa, da radę osiągnąć taki efekt?
Mephistofeles
Sprawdź nagłówek X-Requested-With, większość bibliotek obsługujących AJAXa taki wysyła.
cycofiasz
Możesz użyć metody post zamiast get, wtedy ktoś będzie musiał trochę się nagimnastykować by uzyskać efekt.
Możesz także sprawdzać nagłówek Referer (czy zawiera nazwę twojej domeny).

sprawdzania X-Requested-With nie polecam
ArekJ
Czyli jak dam Referer + post powinno być dobrze?
Bo w sumie post'a samego może podrobić, a referera i post'a to chyba już nie będzie się chciało w tak małej sprawie winksmiley.jpg
cycofiasz
zapytanie post jest nieco wolniejsze niż get więc sam referer też chyba da radę i nie trzeba będzie przerabiać tyle kodu php
ArekJ
Przerabianie to akurat nie problem, bo i tak muszę to pooptymalizować czyli od nowa większość przepisać - bo kod jest dość stary.
Dzięki za pomoc!
Crozin
W skrócie: daruj sobie, bo jest to kompletnie bezcelowe i niemożliwe do zrealizowania. W dodatku ominięcie tych "zabezpieczeń" to minuta roboty.

Pod absolutnie żadnym pozorem nie korzystaj z nagłówka Referer - jest on zbyt mało "stabilny".
Korzystanie z X-Requested-With jest jak najbardziej OK, ale jako forma zabezpieczenia? Śmieszne.

Cytat
zapytanie post jest nieco wolniejsze niż get
Niby dlaczego?
Mephistofeles
Wiadomo, zabezpieczenie mało skuteczne, ale myślę, że tu chodzi bardziej o to, żeby zwykły użytkownik nie wszedł na stronę np. bez layoutu, czy nie dostał w odpowiedzi tylko JSONa, do tego w zupełności wystarczy taki nagłówek.
Crozin
Tylko jak miałby to zrobić? Musiałby przejrzeć kod/wysyłane żądania by ustalić, że chodzi o adres /ajax/doSth.php. No przecież nie wejdzie tak ot. A jak już będzie chciał to takie "zabezpieczenia" co najwyżej rozbawią.
ArekJ
Czyli myślicie, że nie ma sensu? Bo zdażyły mi się przypadki, w których ludzie zwracają uwagę, że mogą bezpośrednio wejść na daną podstronę i wyświetla się ona bez lay'outu, wiem, że nie zagraża to bezpieczeństwu strony - to i tak jest tam sprawdzane, ale niszczy względy estetyczne.
Chociaż z drugiej strony nikt nikomu nie każe włazić w źródło strony i skakać po ładowanych stronach.
melkorm
Cytat
Niby dlaczego?


Bo jest wykonywany w dwóch etapach:
1. Nagłówki.
2. Dane.
Crozin
Cytat
Czyli myślicie, że nie ma sensu?
Tak, jest to bez sensu.
Cytat
Bo zdażyły mi się przypadki, w których ludzie zwracają uwagę, że mogą bezpośrednio wejść na daną podstronę i wyświetla się ona bez lay'outu
Ty umieszczasz na stronie jakieś linki typu <a href="/ajax/...">nie klikać!</a> czy może to informacje od ludzi, którzy patrzą jakie żądania wykonuje JS, wchodzą na jakiś "roboczy" URL i podniecają się tym, że udało im się bezpośrednio w przeglądarce zobaczyć dane, z których korzysta JS? Możesz im też podlinkować do /styles/main.css. Możesz im też powiedzieć, że jak sobie ręcznie usuną element HEAD (np. takim Fiebugiem) to strona się "posypie".
Mam nadzieję, że teraz rozumiesz bezsensowność swoich działań.

Cytat
Bo jest wykonywany w dwóch etapach:
1. Nagłówki.
2. Dane.
Ani żądanie, ani odpowiedź HTTP nie jest wysyłana w dwóch etapach - wszystko leci naraz.

Tak gwoli przypomnienia:
Kod
# Żądanie GET

GET /blah/blah/blah.html?a=b&c=d HTTP/1.1
Host: domain.com

# Żądanie POST

POST /blah/blah/blah.html?a=b&c=d HTTP/1.1
Host: domain.com

# Żądanie POST z dodatkowymi danymi

POST /blah/blah/blah.html?a=b&c=d HTTP/1.1
Host: domain.com

key1=val1&key2=val2&key3=val3
No faktycznie, żądanie POST będzie o jeden bajt "cięższe" od GET.
melkorm
Cytat
Powyższe zalecenia nieco się zmieniają, jeśli tworzymy aplikację ajaksową. Wykorzystanie XMLHttpRequest sprawia, że przeglądarki przesyłają dane metodą POST w dwóch etapach – najpierw nagłówek, a później dane. Znacznie zmniejsza to responsywność ajaksowej aplikacji – czyli to, czego użytkownicy od niej wymagają. Dlatego w wypadku wykorzystania Ajaksa, jeśli nasze zapytanie nie przekracza 2048 znaków i nie zawiera w sobie danych, których nie mamy prawa przechowywać, zawsze korzystajmy z metody GET.


Source
Crozin
Wybacz, ale niestety autor podlinkowanego tekstu to idiota - wygląda na to, że nie ma pojęcia jak działa protokół HTTP.

A teraz dlaczego autor to idiota:
Cytat
O tym, że do czynienia mamy z metodą GET możemy się przekonać, jeśli w URI strony widzimy ciąg uporządkowanych par parametr=wartość (np. strona.php?kategoria=tshirty&strona=2).
O metodzie (GET/POST/HEAD/PUT/DELETE/etc) informuje sam początek żądania - jest jawnie podane jaką metodę stosujemy. Fragment ?key=val&key=val&key=val to po prostu fragment URLa, tak jak /download/abc.7z.
Cytat
Dane przesłane tą metodą trafiają do tablicy $_GET.
Metodą GET nie przesyłamy żadnych danych... przykro mi.
Cytat
Z metodą POST mamy do czynienia, gdy w URI nie widać żadnych parametrów.
Kod
<form action="do.php?action=save" method="post">...
No popatrz... formularz wyśle mi metodą POST trochę danych, ale jakieś tam parametry są w URLu. Aaaa... te parametry nie mają nic wspólnego z metodą!
Cytat
Jako że użytkownik nie może podejrzeć przesłanych danych, tą metodą przesyłamy np. dane uwierzytelniające.
Może.
Cytat
Wykorzystanie XMLHttpRequest sprawia, że przeglądarki przesyłają dane metodą POST w dwóch etapach – najpierw nagłówek, a później dane.
Próba wysłania dwóch żądań - jednego z nagłówkami, drugiego z treścią - skończy się pięknym komunikatem: Error 400 Bad Request


Następnym razem, przed podlinkowaniem sprawdź rzetelność autora.
melkorm
Nie oceniałem jakości tego artykułu bo mówi sam za siebie.
Tutaj jest lepiej wyjaśnione

I GET jest wydajniejszy.

P.S. Trochę off-top się zrobił.
Mephistofeles
Tu nie chodzi o żądania, a o pakiety, które (podobno) lecą 2 we wszystkich przeglądarkach z wyjątkiem Firefoxa.
Crozin
Cytat
Note: Remember that query strings (i.e. name/value pairs) get transferred in the URL of GET requests:
Kod
GET /blog/?name1=value1&name2=value2 HTTP/1.1
Host: carsonified.com
and in the body of POST requests:
Kod
POST /blog/ HTTP/1.1
Host: carsonified.com

name1=value1&name2=value2
Kolejny geniusz.

Udało się mi jednak znaleźć coś wartościowego: http://josephscott.org/archives/2009/08/xm...-for-http-post/ Rzeczywiście część przeglądarek podzieli żądanie POST na dwa pakiety TCP, prawdopodobnie celem optymalizacji przy dużych rozmiarach przesyłanych danych. Innymi słowy: w 99% przypadków kompletnie bez znaczenia, a zysk w pozostałych przypadkach będzie znikomy, wręcz pomijalny.

Cytat
I GET jest wydajniejszy.
Nie, nie jest.
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.