2017-05-24 69 views
5

Mam dwie subdomeny content i www w domenie example.com. Treść z content.example.com jest prezentowana w www.example.com przez element iframe.Implikacje dla bezpieczeństwa dotyczące ustawiania document.domain w treści iframed

Ponieważ zawartość content.example.com potrzeb przekazać www.example.com mam ustawione document.domain="example.com" a także ustawić allow-scripts i allow-same-origin na iframe.

Obawiam się, że jeśli użytkownicy mogą przesyłać treści wyświetlane w elemencie iframe, może to być przydatne, tj. Wysłać zawartość plików cookie do domeny zdalnej w celu przejęcia sesji lub innych exploitów związanych z bezpieczeństwem.

Ustawiłem inną domenę, www.example2.com i ustawiłem żądanie AJAX w treści iframed na content.example.com, aby przetestować moją teorię i wysyłam document.cookie do domeny zdalnej. Powoduje to, że ciasteczka _ga są wysyłane do domeny zdalnej. W domenie zdalnej zezwoliłem na header('Access-Control-Allow-Origin: *'), więc nie powoduje żadnych problemów.

Dlaczego wysyłane są tylko pliki cookie _ga? Mam wiele innych plików cookie na tej samej domenie i ścieżce co pliki _ga, ale nie są one wysyłane. Czy robią to inne zagrożenia bezpieczeństwa? Najlepiej, jeśli będzie to możliwe tylko w przypadku komunikacji między content.example.com a www.example.com. Wygląda na to, że głównie to robi, z wyjątkiem plików cookie Google Analytics, co może oznaczać, że inni też będą w stanie to zrobić.

+0

_I mieć dwie domeny, 'content.example .com' i 'www.example.com'_' content.example.com' to poddomena 'example.com' –

+0

Tak, przepraszam, mam dwie subdomeny. – Rudiger

+0

, aby uzyskać dostęp do pliku cookie domeny z subdomeny, nie musisz iść zbyt ciężko. To jest łatwe zadanie: –

Odpowiedz

0

Możesz używać JSONP do komunikowania się z różnymi domenami, niezależnie od ustawień i zasad w wielu domenach.

Jednak JSONP wymaga po stronie serwera do budowania funkcji zwrotnej z zwróconymi danymi jako parametrem.

Proponuję załadować zwykłą zawartość Javascript z serwera, który ma taką samą niezależność między domenami i bezpieczeństwo, jak żądanie JSON.

Say masz plik JavaScript, data.js, w content.example.com lub usługi przekazujących tę samą treść co plik w odpowiedzi, z obiektu JSON, z prefiksem o zmiennej Zadanie:

result = { 
    "string1": "text1", 
    "object1": { 
    "string2": "text2", 
    "number1": 5.6 
    }, 
    "number2": 7, 
    "array1": ["text3", "text4"] 
} 

Następnie w swojej stronie internetowej, w www.example.com można mieć skrypt z funkcją loadJS, który ładuje odpowiedź serwera jako skrypt:

var loadJS = function (url, callback) { 
    var script = document.createElement('script'); 
    script.type = "text/javascript"; 
    script.src = url; 
    script.onload = function (ev) { 
    callback(window.result); 
    delete window.result; 
    this.parentNode.removeChild(this); 
    }; 
    document.body.appendChild(script); 
}; 

window.onload = function() { 
    loadJS('http://content.example.com/data.js', function (data) { 
    console.log(data); 
    }); 
}; 

Ta sama funkcja może być użyta w content.example.com dla żądań w przeciwnym kierunku.

W celu ustawienia plików cookie lub wykonywanie innych funkcji dostępnych w JS, skryptu odpowiedź, data.js może zawierać funkcję aniżeli obiekt JSON:

result = (function() { 
    document.cookie = "cookie1=Value1; cookie2=Value2;"; 
    return true; 
})(); 
+0

Jestem trochę zagubiony z twoją odpowiedzią. Atakujący nie będzie w stanie kontrolować zawartości w elemencie macierzystym elementu iframe, więc nie będzie mógł dodać do niego javascript (loadJS). Z mojego poprzedniego użycia JSONP, nadal jest związany tymi samymi regułami, co standardowe żądanie AJAX, jeśli chodzi o dostęp do plików cookie, ale może pomóc w komunikacji z serwerem, gdzie możesz nie mieć pełnej kontroli nad serwerem i twoją dostawą zapobieganie skryptom witryny, ponieważ odpowiedź nagłówka na to nie pozwala. Czy to prawda? – Rudiger

+0

Nie JSONP ani JS są powiązane z tymi samymi regułami co AJAX. Możesz załadować obiekt JSON z AJAX, ale będziesz miał problem z wieloma domenami, i, co ważniejsze, pod względem bezpieczeństwa, odebrana treść jest widoczna w dokumencie docelowym, podczas gdy JSONP i JS, załadowane jako skrypty, są piaskowane , tj. wykonane, ale nieczytelne, powodu, dla którego nie podlegają ograniczeniom między domenami. –

+0

W każdym razie jest to tylko sugestia, aby uzyskać bezpieczną komunikację między domenami w najprostszy sposób. Bardziej zaawansowane rozwiązania będą wymagać silnych technik szyfrowania klienta i serwera. –