2009-09-08 12 views
9

Niedawno zacząłem kodować mocno obsługiwane skrypty AJAX w PHP, jest tak, że pliki dostępne przez wywołania AJAX również mogą być użyte bezpośrednio, jak to wyłączyć?Dostęp tylko do AJAX

Odpowiedz

21

Nie można niezawodnie temu zapobiec. Klucz naprawdę nie polega na tym, że ktoś uzyskuje dostęp do tego pliku bezpośrednio jako problem bezpieczeństwa - plan jest możliwy i będziesz w znacznie bezpieczniejszym miejscu.

Niektórzy ludzie mogą polecić kod, który wygląda jak ten (lub podobny):

if(!empty($_SERVER['HTTP_X_REQUESTED_WITH']) 
    && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') { 
    // more code here 
} 

Jednak faktem jest, że nagłówki HTTP mogą zostać sfałszowane dość łatwo i nie są środkiem do zabezpieczania kodu. Podczas testów na obciążonej stronie zauważyłem, że te nagłówki i tak nie są tak niezawodne.

+0

Spot na. Alternatywnie możesz przekazać parametr (np. '? Ajax'), ale jest to jeszcze łatwiejsze do sfałszowania. –

0

Nie można bezpośrednio zabronić dostępu. Ponieważ zapytanie zawsze można spreparować, aby pasowało do podanych kryteriów.

Jeśli XmlHttpRequest jest używany do kwerendy serwera to dodaje nagłówek, który może być wykryty za pomocą mniej więcej tak:

/* AJAX check */ 
if(!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') { 
    //Do something here 
} 
-1

Sesji użyte w aplikacji.

Montaż:

  1. Rejestracja witryny w sesji, używam UUID za to.

  2. Ustaw plik cookie o tej samej wartości, którego używasz w sesji.

  3. Wyślij swoje żądanie AJAX z parametrem, który zawiera również tę wartość.

  4. Porównaj wartości z sesji, pliku cookie i parametru.

+0

Co jest nie tak z moją odpowiedzią? – Joerg

+0

Nie głosowałem za tobą, ale to wciąż nie jest wiarygodna droga. Może to być całkiem wygodne w implementacji, ale może również zostać sfałszowane. – Boldewyn

6

Jak sugerowali inni ludzie w swoich odpowiedziach, nie jest to możliwe. Wynika to z jednej z podstawowych zasad bezpieczeństwa komputerowego: nigdy nie można ufać klientowi. Właśnie dlatego sprawdzamy wszystkie dane wejściowe od klienta, itp.

Zamiast próbować blokować innym klientom dostęp do twoich usług, zamiast tracić czas na pisanie defensywnych usług internetowych. Co ważne, upewnij się, że złośliwi użytkownicy nie mogą wymsknąć się zastrzykom lub innym atakom za pośrednictwem logiki biznesowej. Np. Upewnij się, że wszystkie wiadomości e-mail są ważne, ludzie nie kupują produktów za ujemne dolary, itp.

O, a fakt, że usługi internetowe są otwarte, to DOBRA RZECZ! Zapewniasz swoim użytkownikom otwarty interfejs API, który jest bardzo czysty! Być może zamiast próbować zablokować swoją społeczność, zaakceptuj ją - daj im trochę dokumentacji, jak połączyć się z twoimi usługami, a oni zdobędą więcej klientów. Zamiast kupować iPhone SDK i spędzać czas na nauce Celu C, może to być jeden z twoich użytkowników.

+1

Jest to możliwe, ale nie jest niezawodne. Poza tym wszystkie ważne punkty –

0

Może powinieneś użyć techniki XSS-defense, jak przekazanie jakiegoś bezpiecznego klucza wraz z żądaniem ajaxowym. I daj tylko klucz do javascriptu, który tworzy asynchroniczne zapytania wraz z załadowaną stroną.

<script type="text/javascript"> 
    window.csrf_key = '<?php $user->getCsrf(); ?>'; 
</script> 

W tym przypadku nie będzie musiał martwić się o ludzi przechodzących żądań do plików bezpośrednio, tylko jeśli trzymać klucze bezpieczne, użyć postów do wywołania działania i zrobić testów poprawności.

Powiązane problemy