URL Parameter durch Post auslesen ?

Code46

Erfahrenes Mitglied
Hi Leute,

wie kann ich durch POST einen url link auslesen ? Geht das überhaupt oder liege ich da Falsch. Jemand sagte mir, man sollte es über den header übergeben und auslesen, aber wie mache ich das ? Könnt ihr mir vielleicht dabei helfen ?

Würde mich sehr freuen, wenn ihr mir hilfreiche links oder tutorials zusenden könntet.
 
$_POST ist nur für die Übergabe von Formulardaten gedacht, soviel ich weiß, aber das was du meinst ist $_GET, mit dem du die Parameter aus der Adresszeile ausliest. Du solltest dabei jedoch darauf achten, dass niemals Zugangsdaten oder ähnlich sicherheitsbehaftete Daten über das $_GET übergibst. Für diese solltest du immer nur $_POST oder nach der Auswertung für alle sicherheitsbehaftete Daten das $_SESSION nutzen.

EDIT: Aber du solltest dabei auch bedenken, nur das nötigste über $_GET zu übergeben, weil sonst die Lesbarkeit der Adresse leidet und sehr sehr lang werden kann.

EDIT2: Vielleicht machst du dich diesbezüglich gleich noch mit über Suchmaschinenfreundliche Adressgestaltung mit schlau.
 
Was ich machen will ist, in einer Andorid/IOS App eine Link einbetten, das eine PHP Datei auf dem Server aufruft das die Device Token übergibt und dies kann ich nur über die URL machen. Also dann hätte ich sowas hier z.b www.meinedomain.de/getDeviceToke.php?toke=12345698872336.

Im moment lese ich die device token durch GET aus, also so:

PHP:
$deviceToken = $_GET[deviceToken];

Dies wiederrum speichere ich ab in einer Datenbank. So, jemand meinte mir ich soll dies durch Post auslesen, aber wie mache ich das ? Bin jetzt total verwirrt.

Wie wäre es am sichersten dies umzusetzten ? Käme eine Web Service in frage(vielleicht Restful) oder ähnliches ??

Wenn ihr mir helfen könntet, würde ich mich sehr freuen.
 
Dann müsste deine Android-App den Request via POST durchführen, statt "nur" eine URL aufzurufen. Somit könntest du dann bspw. via $_POST['deviceToken'] darauf zugreifen. Aber wie geschrieben, dafür muss der Aufrufer auch mit HTTP-POST anfragen.

Das in einen Restful-Service einzubauen erfordert noch mehr Kenntnisse über HTTP, ist also einerseits nicht verkehrt, aber wenn du bereits mit dem Unterschied GET/POST verwirrt bist, solltest du ggf. erstmal mit dem HTTP-Protokoll auseinandersetzen:

http://selfphp.de/praxisbuch/print/...xisbuch/praxisbuchseite.php?site=183&group=32

Nur eines vorweg: Wenn dein jemand dir den Rat gegeben hat der Sicherheit wegen, GET & POST sind sicherheitstechnisch nicht wirklich unterschiedlich. Es wird alles im Klartext übertragen, soweit kein httpS verwendet wird. Und von Manipulation ist es auch nicht geschützt nur weil es mit POST übertragen wird. POST macht bei größeren Datenmengen Sinn, bei einem einzelnen Parameter wie einem Token ist es IMHO Kanonen auf Spatzen. Wenn das Token (der App) nur bekannt ist, nachdem man sich authorisiert hat und ggf. ein One-Time-Pad ist, hast du sicherheitstechnisch gute Arbeit geleistet. Dann noch Übertragung via HTTPS, und es ist schon nicht mehr so einfach, das zu manipulieren oder auszulesen.
 
Nein, das wird nicht durch einen Header verschickt. Verabschiede dich in diesem Fall von dem Begriff LINK, es handelt sich um einen URI (Unified Resource Identifier).

Wenn du Parameter an den sog. Query-String anhängst (also Daten via GET überträgst: ?token=asdfghjhkj) sind sie Daten im Header. Wenn du sie in eine POST-Request einbettest, sind das Teile des HTTP-Body. Beim Übertragen via POST sind die Payload-Daten im URI nicht enthalten, also für den Benutzer, der den Client verwendet zunächst "unsichtbar". Auch ein Proxy wird mit den Daten nichts anstellen (im Falle von Übertragung via HTTPs wird er das nicht mal können).

Header sind nur Daten wie URL, akzeptiertes Encoding, Sprache, Antwort-Body-Größe etc. Hier mal eine Beispiel-Kommunikation:

Client (bspw. Browser) sendet eine Anfrage an die Seite http://www.test.de:

Code:
GET / HTTP/1.1
Host: www.test.de
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:39.0) Gecko/20100101 Firefox/39.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: de,en-US;q=0.7,en;q=0.3
Accept-Encoding: gzip, deflate
DNT: 1
Connection: keep-alive

Server (auf www.test.de) sendet daraufhin diese Antwort:

Code:
HTTP/1.1 301 Moved Permanently
Content-Type: text/html; charset=UTF-8
Location: https://www.test.de/
Server: Microsoft-IIS/8.5
Strict-Transport-Security: max-age=31536000;
Date: Fri, 28 Aug 2015 08:09:30 GMT
Content-Length: 143

Alles was bis hier hin zu lesen ist, sind nur Header. Diese sind im HTTP-Protokoll spezifiziert. Eigene Header sind zwar möglich, aber ich rate davon ab, da ein Proxy oder Server selbst die Custom-Header filtern könnte, und das auch nicht wirklich der Bereich ist, Nutzdaten zu übertragen.

So und jetzt POST, wieder erstmal Client (Anfrage):

Code:
POST /kontakt/ HTTP/1.1
Host: www.test.de
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:39.0) Gecko/20100101 Firefox/39.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: de,en-US;q=0.7,en;q=0.3
Accept-Encoding: gzip, deflate
DNT: 1
Referer: https://www.test.de/kontakt/
Cookie: sid=ejf3d42xrq2os0gfa5tb5bo4; wt3_eid=%3B368664393966025%7C2144074937300292260%232144074965300152638; wt3_sid=%3B368664393966025
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded
Content-Length: 168
module=ContactForm&thema=&text=schnick+schnack&email=&anrede=&vorname=&name=&abonr=&strasse=&plz=&ort=&telefon=&extendedform=Kontaktanfrage&extendedformbutton0=+Senden+


Und die Antwort des Servers:

Code:
HTTP/1.1 200 OK
Cache-Control: no-cache, no-store
Pragma: no-cache
Content-Type: text/html; charset=utf-8
Content-Encoding: gzip
Expires: -1
Vary: Accept-Encoding
Server: Microsoft-IIS/8.5
Strict-Transport-Security: max-age=31536000;
Date: Fri, 28 Aug 2015 08:14:27 GMT
Content-Length: 11886

Wie man sehen kann, sind in der Anfrage vom Client die Payload-Daten unterhalb des Headers "Content-Length" im Klartext zu sehen, dies aber nur, weil ich die Daten vom Browser mit schneiden lasse. Aber es verdeutlicht, dass es nur weil es mit POST übertragen wird, nicht frei von Manipulation ist.
 
Zuletzt bearbeitet:
Danke schön für die ausführliche Angabe. Jetzt hast du mich aber total verwirrt. Also in meinem Falle, wie müsste ich das denn lösen ? Weil der code wird in Ionic geschrieben und dort wird er als POST request übergeben. Theorätisch müsste ich nur den Header auslesen oder nicht ??
 
Zuletzt bearbeitet:
Wir fassen mal zusammen:

- Du willst, dass die Daten im URI nicht sichtbar sind
- Du willst, dass die Daten nicht in irgendwelchen Logs (bspw. einem Proxy) auftauchen

Grundsätzlich ist POST damit erstmal der richtige Ansatz. Custom-Header ist dafür nicht geeignet, da Header nicht zwangsläufig beim Server ankommen müssen (werden ggf. gefiltert). Jedoch ist POST per se erstmal nicht "sicher", daher solltest du eine Kombination aus HTTPS und POST verwenden.

Um das tun zu können, muss dein Server HTTPS unterstützen, also ein SSL-Zertifikat installiert und konfiguriert haben. Dein HTTP-Client (in dem Fall die Android-App) muss das Zertifikat anerkennen (akzeptieren). Erst dann kann eine Kommunikation stattfinden. Die Anerkennung des Zertifikats ist i.d.R. an das Vertrauen gegenüber dem Aussteller geknüpft. Wenn der Aussteller kein Vertrauter ist (z.B. bei einem Zertifikat, dass man selbst ausgestellt hat), wird der HTTP-Client das Zertifikat zunächst ablehnen und dem Benutzer überlassen, das Zertifikat zu akzeptieren (diese Meldung hast du bestimmt schon mal gesehen).

Deine Android-App muss also einen HTTP-Client verwenden, dem du mitteilen kannst, dass du Daten über HTTPS anforderst und die Möglichkeit anbieten, diese Daten via POST zu übertragen.

Ich gehe derzeit davon aus, dass du als HTTP-Client den Browser von Android bzw. IOS verwenden willst. Das wäre dann IMHO erstmal nicht möglich. Das muss man "zu Fuß" programmieren. Für sowas gibt es Libraries. Bei IOS kann ich da nicht wirklich was empfehlen, da ich von IOS-App-Entwicklung keine Ahnung habe. Bei Android jedoch, kannst du jede beliebige HTTP-Client-Library verwenden, die es für Java gibt. Z.B. den von Apache: http://hc.apache.org/httpcomponents-client-ga/

Interessantes zum Nachlesen an dieser Stelle:

Beispiele für die Verwendung des Apache-HTTP-Client: http://hc.apache.org/httpcomponents-client-ga/examples.html
Nützliche Infos zum Thema HTTPS: http://www.softed.de/fachthema/https.aspx

Ich würde jedoch noch einen Schritt weiter gehen, und das Device-Token als One-Time-Pad zu übertragen. Aber ein Versuch via POST + HTTPS dürfte erstmal genügen.
 
Sorry für Doppel, aber ich muss auf diese Frage separat eingehen:

Weil der code wird in Ionic geschrieben und dort wird er als POST request übergeben. Theorätisch müsste ich nur den Header auslesen oder nicht ??

Ich kenne Ionic nicht, aber es sieht erstmal wie eine HTTP-Client-Library aus. Wenn du damit einen POST-Request an deinen Server schickst, der mit PHP läuft, und der URI ein PHP-Script ist, werden sämtliche Request-Parameter, die über POST gesendet wurden, auch in der super-globalen Variable $_POST verfügbar sein. Hast du ein Beispiel-Request von Ionic aus? Dann kann man es anhand dieses Beispiels erklären.
 
Hi Saftmaster,
also ich habe es hinbekommen undzwar habe ich die Situation reproduziert und mit jquery einen Post request abgeschickt und dies denn mit PHP &_POST ausgelesen. Aber dank dir habe ich einiges dazu gelernt. Vielen Dank nochmal für deine Hilfe
 
Zurück