JavaScript potrzebuje dostępu do plików cookie, jeśli AJAX jest używany w witrynie z ograniczeniami dostępu opartymi na plikach cookie. Czy pliki cookie HttpOnly będą działać w witrynie AJAX?
Edycja: firma Microsoft stworzyła sposób zapobiegania atakom XSS, uniemożliwiając dostęp JavaScript do plików cookie, jeśli określono HttpOnly. FireFox później przyjął to. Więc moje pytanie brzmi: jeśli używasz AJAX w witrynie, takiej jak StackOverflow, czy pliki cookie tylko dla HTTP są opcją?
Edycja 2: Pytanie 2. Jeśli celem HttpOnly jest uniemożliwienie dostępu JavaScript do plików cookie, a nadal można pobrać pliki cookie za pomocą JavaScript za pośrednictwem obiektu XmlHttpRequest, jaki jest cel HttpOnly ?
Edycja 3: Oto cytat z Wikipedii:
Kiedy przeglądarka otrzyma taki plik cookie, powinna używać go jak zwykle w kolejnych wymianach HTTP, ale nie po to, aby był widoczny dla skryptów po stronie klienta. [32]
HttpOnly
Flaga nie jest częścią żadnego standardu, i nie jest realizowany we wszystkich przeglądarkach. Należy pamiętać, że obecnie nie ma możliwości zapobiegania odczytywaniu ani zapisywaniu plików cookie sesji za pośrednictwem żądania XMLHTTPRequest. [33].
Rozumiem, że document.cookie
jest to blokowane, gdy używasz HttpOnly. Wygląda jednak na to, że nadal możesz odczytywać wartości cookie w obiekcie XMLHttpRequest, zezwalając na XSS. W jaki sposób HttpOnly sprawia, że jesteś bezpieczniejszy niż? Tworząc pliki cookie zasadniczo tylko do odczytu?
W Twoim przykładzie nie mogę pisać do Ciebie document.cookie
, ale nadal mogę ukraść Twój plik cookie i wysłać go do mojej domeny za pomocą obiektu XMLHttpRequest.
<script type="text/javascript">
var req = null;
try { req = new XMLHttpRequest(); } catch(e) {}
if (!req) try { req = new ActiveXObject("Msxml2.XMLHTTP"); } catch(e) {}
if (!req) try { req = new ActiveXObject("Microsoft.XMLHTTP"); } catch(e) {}
req.open('GET', 'http://stackoverflow.com/', false);
req.send(null);
alert(req.getAllResponseHeaders());
</script>
Edycja 4: Przepraszam, chodziło mi o to, że możesz wysłać XMLHttpRequest do domeny StackOverflow, a następnie zapisać wynik getAllResponseHeaders () do łańcucha, wyregexować plik cookie, a następnie wysłać go do domeny zewnętrznej. Wygląda na to, że Wikipedia i ha.ckers zgadzają się ze mną w tej sprawie, ale chciałbym zostać ponownie wyedukowany ...
Ostateczna edycja : Ahh, najwyraźniej obie strony są błędne, w rzeczywistości jest to błąd w FireFox . IE6 i 7 są właściwie jedynymi przeglądarkami, które obecnie w pełni obsługują HttpOnly.
Aby powtórzyć wszystko, czego się nauczyłem:
- HttpOnly ogranicza cały dostęp do document.cookie w IE7 i FireFox (nie jestem pewien co do innych przeglądarek)
- HttpOnly usuwa informacje o plikach cookie z nagłówków odpowiedzi w XMLHttpObject.getAllResponseHeaders () w IE7.
- Obiekty XMLHttpObject mogą być przesyłane tylko do domeny, z której pochodzą, więc nie ma przesyłania plików cookie między domenami.
edycja: ta informacja prawdopodobnie nie jest już aktualna.