Wykonuję wywołanie ajax do mojego własnego serwera na platformie, którą ustawili, aby zapobiec tym wywołaniom ajax (ale potrzebuję go, aby pobrać dane z mojego serwera, aby wyświetlić pobrane dane z bazy danych mojego serwera). Mój skrypt ajax działa, może wysyłać dane do skryptu php mojego serwera, aby umożliwić jego przetwarzanie. Nie może jednak odzyskać przetworzonych danych, ponieważ są one blokowane przez"Access-Control-Allow-Origin"
Nie mam dostępu do źródła / rdzenia tej platformy. więc nie mogę usunąć skryptu, który nie pozwala mi tego zrobić. (P / SI użył konsoli Google Chrome i odkrył ten błąd)
Kod Ajax, jak pokazano poniżej:
$.ajax({
type: "GET",
url: "http://example.com/retrieve.php",
data: "id=" + id + "&url=" + url,
dataType: 'json',
cache: false,
success: function(data)
{
var friend = data[1];
var blog = data[2];
$('#user').html("<b>Friends: </b>"+friend+"<b><br> Blogs: </b>"+blog);
}
});
lub czy istnieje JSON
kod równoważny powyższemu skryptowi ajax? Myślę, że JSON
jest dozwolone.
Mam nadzieję, że ktoś może mi pomóc.
Odpowiedzi:
Umieść to na górze retrieve.php:
Pamiętaj, że to skutecznie wyłącza ochronę CORS i naraża użytkowników na atak. Jeśli nie masz całkowitej pewności, że musisz zezwolić na wszystkie źródła, powinieneś zablokować to do bardziej konkretnego źródła:
Proszę zapoznać się z poniższą odpowiedzią stosu dla lepszego zrozumienia
Access-Control-Allow-Origin
https://stackoverflow.com/a/10636765/413670
źródło
Dobrze, ale wszyscy wiecie, że * jest symbolem wieloznacznym i umożliwia wykonywanie skryptów między witrynami z każdej domeny?
Chcesz wysłać wiele
Access-Control-Allow-Origin
nagłówków dla każdej witryny, która może to zrobić - ale niestety oficjalnie nie jest obsługiwane wysyłanie wieluAccess-Control-Allow-Origin
nagłówków lub tworzenie wielu źródeł.Możesz rozwiązać ten problem, sprawdzając źródło i odsyłając go w nagłówku, jeśli jest to dozwolone:
To o wiele bezpieczniejsze. Możesz edytować dopasowanie i zmienić je na funkcję ręczną z pewnym wyrażeniem regularnym lub czymś takim. Przynajmniej odeśle to tylko 1 nagłówek, a będziesz pewien, że to ten, z którego pochodzi żądanie. Pamiętaj, że wszystkie nagłówki HTTP mogą być sfałszowane, ale ten nagłówek służy ochronie klienta. Nie chroń swoich danych za pomocą tych wartości. Jeśli chcesz dowiedzieć się więcej, przeczytaj trochę o CORS i CSRF.
Dlaczego jest bezpieczniej?
Zezwalanie na dostęp z innych lokalizacji niż Twoja zaufana witryna umożliwia przechwytywanie sesji. Idę z małym przykładem - obraz Facebook pozwala na wieloznaczne pochodzenie - oznacza to, że możesz gdzieś stworzyć własną stronę internetową i uruchamiać połączenia AJAX (lub otwarte iframe) na Facebooku. Oznacza to, że możesz pobrać zalogowane informacje na Facebooku osoby odwiedzającej Twoją witrynę. Co gorsza - możesz skryptować
POST
żądania i publikować dane na czyimś facebooku - tylko podczas przeglądania Twojej witryny.Zachowaj ostrożność podczas używania
ACAO
nagłówków!źródło
header()
zastępuje poprzedni nagłówek tego samego typu. Więc tak naprawdę wszystko, co robisz, to ustawianie ostatniego nagłówka. Ręczne wprowadzanie stwierdza, że można ustawić drugi parametrfalse
, aby zapobiec poprzedni nagłówek jest nadpisane.Ostrzeżenie : Chrome (i inne przeglądarki) będą narzekać, że ustawiono wiele nagłówków ACAO, jeśli zastosujesz się do innych odpowiedzi.
Błąd będzie podobny
XMLHttpRequest cannot load ____. The 'Access-Control-Allow-Origin' header contains multiple values '____, ____, ____', but only one is allowed. Origin '____' is therefore not allowed access.
Spróbuj tego:
źródło
Rozwiązałem ten problem podczas wywoływania kontrolera MVC3. Dodałem:
przed moim
A także
$.ajax
narzekałem, że nie akceptuje nagłówka Content Type w moim wywołaniu ajax, więc skomentowałem go, ponieważ wiem, że jego JSON jest przekazywany do akcji.Mam nadzieję, że to pomaga.
źródło
Jest to naprawdę zły pomysł
*
, który sprawia, że jesteś otwarty na skrypty między witrynami. Zasadniczo chcesz mieć własną domenę przez cały czas, z uwzględnieniem aktualnych ustawień SSL i opcjonalnie dodatkowych domen. Chcesz również, aby wszystkie były wysyłane jako jeden nagłówek. Poniższe elementy zawsze autoryzują Twoją domenę w tym samym zakresie SSL, co bieżąca strona, i opcjonalnie mogą obejmować dowolną liczbę dodatkowych domen. Wyśle je wszystkie jako jeden nagłówek i zastąpi poprzednie, jeśli coś już je wysłało, aby uniknąć jakiejkolwiek możliwości narzekania przeglądarki na wysyłanie wielu nagłówków kontroli dostępu.Stosowanie:
Masz pomysł.
źródło
Czy próbowałeś rzeczywiście dodać nagłówek Access-Control-Allow-Origin do odpowiedzi wysłanej z twojego serwera? Jak
Access-Control-Allow-Origin: *
?źródło