Een HTTP-verzoek verzenden met Telnet

Hoe krijg ik de inhoud van een webpagina met Telnet?

Bijvoorbeeld de inhoud van https://stackoverflow.com/questions.


Antwoord 1, autoriteit 100%

telnet servernaam 80


GET /index.html↵
↵

↵ betekent ‘return’, je moet twee keer op return drukken


Antwoord 2, autoriteit 90%

Je zou kunnen doen

telnet stackoverflow.com 80

En dan plakken

GET /questions HTTP/1.0
Host: stackoverflow.com
# add the 2 empty lines above but not this one

Hier is een transcriptie

$ telnet stackoverflow.com 80
Trying 151.101.65.69...
Connected to stackoverflow.com.
Escape character is '^]'.
GET /questions HTTP/1.0
Host: stackoverflow.com
HTTP/1.1 200 OK
Content-Type: text/html; charset=utf-8
...

Antwoord 3, autoriteit 80%

Voor het nageslacht, uw vraag was hoe u een http-verzoek naar https://stackoverflow.com/questionskunt sturen. Het echte antwoord is: dat kan niet met telnet, omdat dit een alleen https-bereikbare url is.

Dus misschien wilt u opensslgebruiken in plaats van telnet, zoals dit bijvoorbeeld

$ openssl s_client -connect stackoverflow.com:443
...
---
GET /questions HTTP/1.1
Host: stackoverflow.com

Dit geeft je het https-antwoord.


Antwoord 4, autoriteit 19%

Om wat uit te breiden op eerdere antwoorden, zijn er een paar complicaties.

telnetis niet bijzonder scriptbaar; misschien gebruik je in plaats daarvan liever nc(ook wel netcatgenoemd), dat niet-terminale invoer en signalen beter afhandelt.

Ook, in tegenstelling tot telnet, staat ncSSL toe (en dus httpsin plaats van http-verkeer — dan heb je poort 443 nodig in plaats van poort 80).

Er is een verschil tussen HTTP 1.0 en 1.1. De recente versie van het protocol vereist dat de kop Host:in het verzoek wordt opgenomen op een aparte regel na de regel POSTof GET, en gevolgd door een lege regel om het einde van de verzoekheaders te markeren.

Het HTTP-protocol vereist regeleindes met regelterugloop/regelinvoer. Veel servers zijn hier soepel in, maar sommige niet. Misschien wilt u

printf "%\r\n" \
    "GET /questions HTTP/1.1" \
    "Host: stackoverflow.com" \
    "" |
nc --ssl stackoverflow.com 443

Als je terugvalt op HTTP/1.0 heb je niet altijd de Host:header nodig, maar veel moderne servers hebben de header toch nodig; als meerdere sites op hetzelfde IP-adres worden gehost, weet de server van GET /foo HTTP/1.0niet of je http://site1.example.com/fooof http://site2.example.net/fooals die twee sites beide op dezelfde server worden gehost (bij afwezigheid van een Host:-header, een HTTP 1.0-server kan gewoon standaard naar een andere site gaan dan degene die je wilt, dus je krijgt niet de inhoud die je wilde).

Het HTTPS-protocol is in deze details identiek aan HTTP; het enige echte verschil is hoe de sessie aanvankelijk is opgezet.

Other episodes