Jak mogę uniemożliwić zaawansowanemu użytkownikowi wywoływanie moich funkcji ajax?

12

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.

Daniel Bingham
źródło
Czy wywołania ajax są całkowicie nieuwierzytelnione? Czy tworzysz sesje dla każdego? Czy istnieją wzorce nadużyć? I czy manipulacje specyficzne dla problemu lub więcej to obciążenie, które dodaje do witryny?
artlung
Czy możesz podać więcej szczegółów? Co robią wywołania AJAX? Co oni manipulują? Jakie problemy występują, jeśli skrypt jest wywoływany poza AJAX?
DisgruntledGoat
Tak naprawdę nie pytam o konkretną okoliczność, ale raczej o ogólne rozwiązanie mające zastosowanie w wielu okolicznościach. Jeśli istnieje takie rozwiązanie, które nie wydaje się takie.
Daniel Bingham

Odpowiedzi:

12

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
2
+1 .. tak jak niemożliwe jest, aby ludzie nie zapisywali lokalnych kopii wszystkiego, co wyświetla ich przeglądarka. To raczej konkurs, aby przekonać się, czy możesz się poddać i przejść do czegoś innego, zanim się zorientują.
Tim Post
6

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.

DisgruntledGoat
źródło
3

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

theycallmemorty
źródło
2
dobry punkt, zakładając, że sprawca nie używa ajax ani nie fałszuje tego nagłówka HTTP
Adam
1

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

cyfra 1001
źródło
+1 za „Bzzt” - który staje się o wiele zabawniejszy w kontekście „Bzzt - dzięki za grę!” po którym następuje powolne przejście w czerń wraz z trzygodzinnym banem wymuszonym przez ciasteczka ustawione na komputerze użytkownika (jestem pewien, że dostaną wiadomość)
danlefree
0

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 Xsesje, 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 do X+1wywołań ajax, zmuś użytkownika do wykonania jakiejś akcji (może captcha? Może nawet czegoś w rodzaju zdarzenia mousemovelub tapzdarzenia 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.

artlung
źródło