2010-04-12 15 views
47

Próbuję zaimplementować proste abstrakcje xhr i otrzymuję to ostrzeżenie podczas próby ustawienia nagłówków dla testu POST. Myślę, że może to mieć coś wspólnego z ustawianiem nagłówków w oddzielnym pliku js, ponieważ kiedy ustawiłem je w tagu <script> w pliku .html, wszystko działało dobrze. Żądanie POST działa poprawnie, ale otrzymuję to ostrzeżenie i jestem ciekaw dlaczego. Dostaję to ostrzeżenie zarówno dla nagłówków content-length, jak i connection, ale tylko w przeglądarkach WebKit (Chrome 5 beta i Safari 4). W Firefoksie nie dostaję żadnych ostrzeżeń, nagłówek Content-Length jest ustawiony na prawidłową wartość, ale Połączenie jest ustawione na podtrzymywanie aktywności zamiast bliskiej, co powoduje, że myślę, że to również ignoruje moje wywołania i generowanie setRequestHeader. jego. Nie próbowałem tego kodu w IE. Oto kod znaczników &:WebKit "Odmówiono ustawiania niebezpiecznego nagłówka" Długość zawartości ""

test.html:

<!DOCTYPE html> 
<html> 
    <head> 
     <script src="jsfile.js"></script> 
     <script> 
      var request = new Xhr('POST', 'script.php', true, 'data=somedata', function(data) { 
       console.log(data.text); 
      }); 
     </script> 
    </head> 
    <body> 
    </body> 
</html> 

jsfile.js:

function Xhr(method, url, async, data, callback) { 
    var x; 
    if(window.XMLHttpRequest) { 
     x = new XMLHttpRequest(); 

     x.open(method, url, async); 

     x.onreadystatechange = function() { 
      if(x.readyState === 4) { 
       if(x.status === 200) { 
        var data = { 
         text: x.responseText, 
         xml: x.responseXML 
        }; 
        callback.call(this, data); 
       } 
      } 
     } 

     if(method.toLowerCase() === "post") { 
      x.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); 
      x.setRequestHeader("Content-Length", data.length); 
      x.setRequestHeader("Connection", "close"); 
     } 

     x.send(data); 
    } else { 
     // ... implement IE code here ... 
    } 
    return x; 
} 
+0

Dlaczego nie chcesz, aby WebKit ustawił to pole nagłówka? – Gumbo

+0

Wydaje mi się, że miałem wrażenie, że to najlepsze praktyki, aby ustawić to pole, aby było spójne w różnych przeglądarkach ... –

+4

Istnieją pola nagłówka, które powinny być lepiej ustawione przez klienta/serwer automatycznie. * Content-Length * jest jednym z nich. – Gumbo

Odpowiedz

63

jest także ignorowanie moich telefonów setRequestHeader i generowania własnych

Tak, standard mówi, że musi:

Ze względów bezpieczeństwa, te kroki powinny być zakończone, jeśli nagłówek jest [...]

  • Connection
  • Content-Length

Messing z tymi, które mogą wystawiać różne ataki request smuggling, więc przeglądarka zawsze używa własnych wartości. Nie ma potrzeby ani powodu, aby próbować ustawić długość żądania, ponieważ przeglądarka może to zrobić dokładnie z długości danych przekazywanych do send().

+3

Książki, w szczególności Nauka PHP, MySqL i JavaScript, nadal uczą ludzi robienia tego ręcznie ... Zrobiłem to samo po przeczytaniu tej książki. –

+0

Muszę setRequestHeader rozpakować pliki .gzip ... czy to jest legalne? –

+0

@Hiro: jaki nagłówek próbujesz ustawić? Żądanie HTTP zwykle nie rozpakowuje zasobu .gzip; istnieje kodowanie zawartości gzip, aby skompresować zasób na drucie, ale znowu przeglądarki wykonają to automatycznie, nie jest to coś, czego potrzebujesz (lub możesz) kontrolować za pomocą 'XMLHttpRequest.setRequestHeader'. – bobince

Powiązane problemy