Het http (Hypertext Transfer) protocol
| Inleiding in het http protocol |
© 2010 Hein Pragt
|
Wanneer ik mensen lesgeef in de basis van programmeren voor het Internet begin ik meestal met
uit te leggen dat er een protocol aan de basis ligt van elk www verzoek. Dit protocol is het
HTTP (Hypertext Transfer Protocol) protocol, een vrij eenvoudig tekst gebaseerd protocol, dat
de communicatie tussen de browser en de HTTP webserver regelt. Wanneer mensen in HTML, PHP, JSP
of DotNet willen gaan programmeren voor het Internet dan is kennis van het onderliggende
HTTP protocol bijna onontbeerlijk. Om te begrijpen wat er werkelijk op en neer gaat
(round trip) moet men begrijpen hoe de verzoeken en
de data heen en weer gaan tussen de browser en de webserver. Ook is het handig om te
weten hoe de diverse HTTP headers werken, hoe HTTP omgaat met cookies en wat het verschil
is tussen een GET en een POST verzoek.
Ook is het bijvoorbeeld heel belangrijk om te weten
dat elk verzoek aan de webserver een afzonderlijk verzoek is en dat tussen uw individuele
vezoeken door, de webserver ook allerlei andere verzoeken af zit te handelen. Na elk verzoek
(request) volgt een antwoord (response) van de webserver, waarna voor de webserver het
verzoek is afgehandeld en vergeten. Alleen in een eventueel logbestand kunt u het verzoek
en het antwoord terugvinden. De HTTP server heeft dus geen sessie beheer en wanneer u
bijvoorbeeld ingelogd wilt zijn op een server, zult u dit buiten het HTTP protocol moeten
oplossen maar op een hoger niveau zoals in bijvoorbeeld de webapplicatie op de webserver
door middel van HTTP headers of een cookie waar een gebruikers identificatie staat.
Een HTTP verzoek (request)
Een HTTP verzoek (request) bestaat uit het verzoekcommando, de URL, de headervelden
en eventueel een inhoud. Dit zijn de verzoekcommando's:
- GET - Ontvang het document gespecificeerd door de URL.
- HEAD - Ontvang alleen de headers van het op te vragen document.
- POST - Zend data naar de server.
- PUT - Vervang het document op de server door de verzonden data (is meestal geblokkeerd).
- DELETE - Verwijder het document (is meestal geblokkeerd).
- OPTIONS - Vraag de mogelijkheden van de server.
Een HTTP antwoord (response)
Een HTTP antwoord (response) bestaat uit een resultaat code, headervelden en een body
(de boodschap).
Een HTTP resultaat code
Een resultaat code bestaat uit minimaal drie cijfers, het eerste cijfer is
het belangrijkste:
- 1xx: een informele boodschap van de webserver die nog gevolgd zal worden door andere data.
- 2xx: een boodschap van de server dat de gevraagde actie succesvol is afgehandeld.
- 3xx: een "redirect" naar een andere locatie.
- 4xx: een foutboodschap (door de client veroorzaakt).
- 5xx: een foutboodschap (door de server veroorzaakt).
- 6xx: een proxy fout is opgetreden.
Voorbeelden van veel voorkomende resultaat codes zijn:
- 200 OK (Het gevraagde document is succesvol opgevraagd).
- 304 Not Modified (T.o.v. de versie in de cache is de pagina niet gewijzigd).
- 403 Forbidden (Het opgevraagde document mag niet verzonden worden).
- 404 Not Found (Het opgevraagde document bestaat niet).
- 500 Internal Server Error.
|
| Eenvoudig voorbeeld van een HTTP sessie |
© 2010 Hein Pragt
Het volgende gebeurt er in de achtergrond wanneer u contact maakt met een Internet host en
een specifieke pagina binnen de site opvraagt. Als voorbeeld vragen we om de pagina
/spelcomputers/programmeren.php van de website HTTP://www.pragt.info op. De volledige URL zal
dus: HTTP://www.pragt.info/spelcomputers/programmeren.php zijn. Als eerste zal de browser een socket
(netwerk) verbinding maken met de host HTTP://www.pragt.info op poort 80 (de standaard HTTP poort)
waarna het volgende tekst verzoek verzonden zal worden naar deze webserver.
*) Noot: [blanko regel] staat voor een lege regel met alleen een regelterugloop code.
GET /spelcomputers/programmeren.php HTTP/1.1
Host: www.pragt.info
User-Agent: Mozilla/5.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: nl,en-us;q=0.7,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Referer: HTTP://www.pragt.info/start/index.php
Cookie: COOKIE data .......... data .......
[blanko regel]
De webserver zal hierna een pagina sturen (gegenereerde HTML door PHP maar voor de ontvanger is het
gewoon HTML) voorafgegaan door enkele HTTP headers.
HTTP/1.x 200 OK
Date: Thu, 15 Apr 2010 12:12:02 GMT
Content-Type: text/html
Server: Apache/1.3.34 (Unix) FrontPage/5.0.2.2635 PHP/4.4.0 mod_ssl/2.8.25 OpenSSL/0.9.8a
X-Powered-By: PHP/4.4.0
Content-Type: text/html
Content-Length: 1354
[blanko regel]
<html>
<body>
<h1>Spellen programmeren.</h1>
(Alle HTML...)
</body>
</html>
Nu is het verzoek voor de webserver geheel afgehandeld, de webserver sluit de socket verbinding
begint aan het volgende verzoek van een andere gebruiker. Aangezien HTTP een stateless protocol is zal
de webserver elk afzonderlijk verzoek afhandelen en daarna is het gereed en afgesloten en weet de
webserver bij een volgend verzoek niet of het van dezelfde of een andere host afkomstig is. het HTTP
protocol zelf is dus niet in staat een sesie bij te houden. Dit is een heel eenvoudig voorbeeld,
normaal zullen er voor een internet pagina vele HTTP verzoeken na elkaar gedaan worden voor alle include
bestanden zoals de .css en .js bestanden, maar ook bijvoorbeeld een afzonderlijk verzoek voor elke
afbeelding die op de pagina staat.
| Het verschil tussen http GET en http POST |
© 2010 Hein Pragt
Het verschil tussen GET en POST is belangrijk als we formulieren gebruiken of via
verborgen formulieren in de pagina data willen doorgeven aan een volgend verzoek. Ook
zal het drukken op een submit knop binnen een formulier een nieuw HTTP verzoek zenden
naar de HTTP webserver waarbij de gegevens uit het formulier ook verzonden zullen worden
naar de HTTP webserver. Dit kan op twee verschillende manieren gebeuren, de eerste manier
is met de GET methode. Deze methode verstuurt de informatie uit het formulier via de url
en in de adresbalk zal het ook zichtbaar zijn.
Voorbeeld: HTTP://www.pragt.info/contact.php?contact_naam=Hein&email=hein@hmp.nl
Achter de URL staat een vraagteken om aan te geven dat er parameters volgend, een
parameter bestaat uit een veldnaam een = teken en een waarde en meerdere parameters
worden gescheiden door een ampersant (&) teken. De gebruiker kan dus de data die
verzonden is naar de HTTP webserver ook zien in de adresbalk. Dit is niet fraai en
ook gevoelig voor manipulatie omdat eenvoudig gegevens gewijzigd kunnen worden
waarna het verzoek opnieuw verzonden kan worden. Een hack poging uit het verleden
bestond er uit dat de postbank de sessie id van de gebruiker via de url meegaf aan
een volgend verzoek. Door in te loggen onder de eigen naam en daarna het sessie
nummer handmatig aan te passen, kon men de sessie van een andere gebruiker overnemen.
Nadat dit bekend werd is er snel een aanpassing gemaakt maar deze hack methode werkt
nog steeds op een aantal sites die op deze wijze een sessie bijhouden.
Naast de GET methode kunt u de gegevens uit een formulier ook verzenden met de POST
methode. In principe werken de POST en GET methode hetzelfde alleen wordt de informatie
uit het formulier niet verzonden via de adresbalk maar via een zogenaamd HTTP headers.
Bij het versturen van het formulier zal men geen informatie in de adresbalk zien, de
informatie wordt niet zichtbaar via HTTP headers verstuurd. Dit maakt de POST methode
een stukje veiliger omdat niemand nu kan wat er eigenlijk verstuurd wordt maar een
echt hacker is ook in staat om headers te manipuleren.
In een framework zoals PHP worden de GET en de POST variabelen meestal in een array
geplaatst voor de webapplicatie. In PHP zullen dit het $_POST[] en het $_GET[] array zijn
waarin de variabele namen als keys staan de waarden als valies. Ook bestaat er soms een
instelling om de GET en POST variabelen automatisch in globale variabelen te stoppen,
maar dit is een bekend veiligheidslek en het zal op de meeste moderne serves ook
uitgeschakeld zijn.
© 2010 Hein Pragt
U kunt een add-on voor Mozilla Firefox downloaden, waarmee u, wanneer u deze add-on
aanzet, alle headers die tussen de browser en de http webserver heen en weer gaan kunt bekijken.
dit kan zeer handig zijn wanneer u een webapplicatie moet testen of debuggen.
Live HTTP Headers
Fiddler is een Web Debugging Proxy die alle HTTP(S) verkeer tussen uw computer and het Internet opslaat
waarna u het kunt inspecteren. Het is een freeware programma en het werkt voor alle browsers maar ook alle
andere web applicaties die HTTP als protocol gebruiken.
Fiddler http monitor
| Historie van het Http protocol |
© 2010 Hein Pragt
De eerste versie van het HTTP protocol heeft de versie 1.0 en in eerste instantie
voldeed dit protocol goed. Toen het web begon te groeien kwamen er ook een aantal
tekortkomingen in dit protocol aan het licht die opgelost in de volgende versie 1.1
die vanaf circa 1997 de standaard op het World Wide Web is Technische details van
HTTP staan beschreven in verschillende RFC's. HTTP versie 1.0 staat in het RFC met
nummer 1945. Versie 1.1 van het protocol staat in RFC met nummer 2616. Deze zijn
te downloaden op: www.rfc-editor.org/rfc.html
Last update: 15-05-2011
|