Mam witrynę, która używa wywołań ajax do wykonywania wielu funkcji. Mają wywołanie zwrotne przeglądarki przez skrypt - ajax.php. Chociaż używam danych pocztowych do przesyłania danych i ograniczania poleceń, które może wywoływać skrypt ajax, tak naprawdę nic nie stoi na przeszkodzie, aby użytkownicy fałszowali wywołania ajax w celu próby zmanipulowania strony. Czy istnieje jakiś ogólny sposób, aby zapobiec fałszowaniu połączeń przez użytkowników? Czy istnieje sposób, aby upewnić się, że wywołanie ajax faktycznie pochodzi z mojej witryny, a nie z innego skryptu lub witryny?
A może po prostu muszę sprawdzić warunki brzegowe w skrypcie php i uniemożliwić użytkownikom fałszowanie rzeczy, których nie wolno im robić, ale pozwolić im na fałszowanie tam, gdzie byłoby to dozwolone.
Odpowiedzi:
Nie sądzę, aby można to było zrobić w sposób niezawodny, ponieważ wszelkie informacje, które możesz wysłać, mogą zostać sfałszowane, w zależności od tego, jak mądry jest użytkownik.
Jeśli chcesz tylko prosty blok osób dzwoniących z Twojej strony, możesz sprawdzić stronę polecającą, użyć pliku cookie lub dodać losowe ukryte pole wysłane przez stronę wywołującą, które wygasa po pewnym czasie. Ale łatwo je sfałszować, jeśli użytkownik jest naprawdę zdeterminowany.
źródło
Krótko mówiąc, nie. Każda prośba wysłana na adres URL za pomocą GET lub POST może zostać złożona przez każdego, kto korzysta z dowolnego oprogramowania. W rzeczywistości żądanie AJAX tak naprawdę nie różni się od bezpośredniego ładowania adresu URL, z tym że zwracane dane są wyświetlane w przeglądarce jak strona internetowa.
To jest właśnie powód, dla którego zawsze powinieneś sprawdzać poprawność przesłanych danych na serwerze, niezależnie od tego, czy przeprowadzasz walidację Javascript.
Nie jest jasne, co dokładnie robi skrypt po stronie serwera i co może pójść nie tak, ale jeśli użytkownicy są w stanie „manipulować witryną”, wywołując skrypt ze złymi danymi, oznacza to, że robisz to źle.
Prawdopodobnie najlepszym rozwiązaniem będzie wprowadzenie jakiejś formy uwierzytelnienia.
źródło
Więc zasadniczo chcesz ograniczyć ajax.php do odpowiadania tylko na żądania AJAX?
Nie jestem ekspertem od php, ale wydaje się, że można ustalić, czy dane żądanie pochodzi od AJAX, czy „zwykłe” żądanie przeglądarki, sprawdzając wartość
$_SERVER['HTTP_X_REQUESTED_WITH']
.Źródło
źródło
Jak ktoś inny zauważył ... wywołania ajax to tylko odbiorniki $ _GET lub $ _POST, więc moim podejściem było zawsze traktować je jak każdą stronę akcji i filtrować / dezynfekować dane wejściowe. Jeśli masz na przykład niewielką odmianę tego, czego oczekujesz, np. Miesiąc, i wiesz, że zawsze ma ona format „Jan, Luty, Mar ...”, możesz ustawić tablicę oczekiwanych wartości i odfiltrować ją. Pułapka na wszystko, co nie pasuje i opcjonalnie odrzuć coś takiego jak „Bzzt ... dzięki za grę ...”
Nie mogę wymyślić przykładu, w którym mój skrypt Ajax musiałby być bezpieczniejszy niż przesłanie formularza.
HTH
źródło
Myślę, że główną częścią twojego rozwiązania będzie ograniczenie ruchu z określonego odcisku palca użytkownika. Może skrót adresu IP, ciąg agenta użytkownika i wysyłane dane.
Pomocne może być również powiązanie strony, która wywołuje ajax z bliżej zwróconymi danymi ajax. Tak więc na stronie, o której mowa, przy ładowaniu strony wyślij klucz sesji, który jest dobry na
X
sesje, dla każdego żądania ajax twój JavaScript będzie musiał przekazać ten klucz z powrotem, albo ajax zwróci błąd. Gdy strona trafi doX+1
wywołań ajax, zmuś użytkownika do wykonania jakiejś akcji (może captcha? Może nawet czegoś w rodzaju zdarzeniamousemove
lubtap
zdarzenia zależnego od UA) przed wysłaniem nowego klucza sesji w dół (poza pasmem z oryginalnego ajax), a następnie uruchom ponownie proces.Chociaż o tym myślę, możliwe, że częścią problemu może być luźna walidacja przesłanych parametrów. Jeśli ludzie mogą po prostu pobawić się przesłanymi parametrami i odzyskać prawidłowe dane, utrudnij to. Jak to zrobić, zależy od tego, jakie wartości są wysyłane przez klienta i jakie krzywdy mogą popełnić zły aktor, wysyłając złe wartości.
źródło