PHP: Sicheres Übertragen von Daten mit http_post_string?

  • Allgemein

    PHP: Sicheres Übertragen von Daten mit http_post_string?

    Hallo Entwickler,

    ich arbeite gerade an einer Möglichkeit Daten auf einem Server zu speichern und wieder abzurufen.
    Das klappt bisher mit http_get() sehr gut. Doch leider ist es nicht besonders sicher.
    Im Prinzip könnte jeder der weiß was er in die Adressleiste des Browsers eingeben muss, Daten auf meinem Server hochladen.
    Ich möchte natürlich nur meine App (iOS) Zugriff darauf gestatten.

    Ich habe eine index.php Seite mit beispielweise folgenden Inhalt:

    PHP-Quellcode

    1. <?php
    2. echo $_GET['password'];
    3. ?>


    und aus meiner App rufe ich folgendes auf:

    GML-Quellcode

    1. httpget = http_get("MEINEWEBSITE/?password="+global.password);


    Darauf bekomme ich vom Server eine Antwort. Zum Beispiel ob das Korrekt ist oder nicht.
    Und hier ist die Sicherheitslücke:
    Zum Beispiel könnte man in seinem Router nachsehen, welche Websiten geöffnet wurden. Oder sonstiges mitloggen lassen.
    Im Prinzip könnte dann jeder diese Adresse mit den Variablen aufrufen.

    Könnte evtl. http_post_string() abhilfe schaffen?
    Ich weiß eigentlich garnicht was das hier eigentlich soll?
    Könnte ich so auf $_POST der PHPs zugreifen? Was auch immer $_POST ist. Bisher konnte ich mit internen Steuerelementen der Website darauf zugreifen.

    Nochmal: Ich möchte ausschließlich NUR mit meiner App auf meiner Website zugreifen.

    Ich hoffe hier tummeln sich einige Experten herum. :)
    $_POST bringt keinen wirklichen Sicherheitsvorteil gegenüber $_GET, es ist ein wenig schwieriger nachzuvollziehen welche Daten genau an deinen Server gesendet werden, aber mit den richtigen Tools immernoch kein wirkliches Problem.

    Wenn du nur deiner App Zugang gestatten willst dann bleibt dir nichts anderes übrig, als die Kommunikation zu verschlüsseln oder zumindest kryptografisch zu signieren. Und auch das ist im Zweifel niemals sicher gegenüber einem Angreifer mit hinreichend viel Ressourcen und viel Interesse am Knacken der Sache ...
    Kann ich überhaupt irgendwie auf $_post von aussen zugreifen? Das geht so viel ich weiß nur über Formular direkt auf der Website. Und $_get steht immer in der Adressleiste.
    Ich blicke immer noch nicht was http_post_string gegenüber http_get anders macht? bzw wo und wie man das einsetzt.
    Könnte man z.b. So variablenwerte auf $_post übergeben?
    GET setzt den Wert in die Adresse rein, während POST die Daten nach dem HTTP Request setzt. Für den Angreifer ist das praktisch irrelevant, wenn er auf den HTTP Request zugreifen kann, kommt er so oder so an die Daten. Mit WireShark kann z.B. die Packets mitlesen (oder FireBug im Firefox z.B.).

    HTTP ist dabei Plaintext, d.h. alles was gesendet wird ist im Klartext (wie z.B. bei FTP) und der Angreifer kann das ganze ohne großen Aufwand mitlesen.
    wupto.net/ Nicht meine Seite!
    We love Koalas.

    GM-D-Spam-o-Meter: 32%
    Also wenn du deine App nur für dich benutzt, kannst du mit den von boxxar erwähnten Methoden eine gewisse Sicherheit erreichen, aber wenn du die App verteilst, kannst du das mit der Sicherheit vergessen. Dein Client, d.h. die App, kennt das Protokoll, über das du mit deinem Server kommunizierst, so dass man diesen nur auseinandernehmen muss, um dann ein Programm schreiben zu können, das gegenüber deinem Server so tut, als sei es diese App.
    Und zum Thema, wie man von außerhalb an die mit POST versendeten Daten kommt, der HTTP request für die Vorschau dieses Beitrags bis hier hin, sieht so aus:
    [hide='Request']POST gm-d.de/wbb/index.php?form=PostAdd&threadID=21725 HTTP/1.1
    Host: gm-d.de
    User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:24.0) Gecko/20100101 Firefox/24.0
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
    Accept-Language: de-de,de;q=0.8,en-us;q=0.5,en;q=0.3
    Accept-Encoding: gzip, deflate
    DNT: 1
    Referer: gm-d.de/wbb/index.php?form=PostAdd&threadID=21725
    Cookie: Das geht niemanden was an.
    Connection: keep-alive
    Content-Type: multipart/form-data; boundary=---------------------------144461275127242
    Content-Length: 3043

    -----------------------------144461275127242
    Content-Disposition: form-data; name="subject"


    -----------------------------144461275127242
    Content-Disposition: form-data; name="text"

    Also wenn du deine App nur für dich benutzt, kannst du mit den von boxxar erwähnten Methoden eine gewisse Sicherheit erreichen, aber wenn du die App verteilst, kannst du das mit der Sicherheit vergessen. Dein Client, d.h. die App, kennt das Protokoll, über das du mit deinem Server kommunizierst, so dass man diesen nur auseinandernehmen muss, um dann ein Programm schreiben zu können, das gegenüber deinem Server so tut, als sei es diese App.
    Und zum Thema, wie man von außerhalb an die mit POST versendeten Daten kommt, der HTTP request für die Vorschau dieses Beitrags bis hier hin, sieht so aus:
    -----------------------------144461275127242
    Content-Disposition: form-data; name="mce_editor_0_fontNameSelect"


    -----------------------------144461275127242
    Content-Disposition: form-data; name="mce_editor_0_fontSizeSelect"

    0
    -----------------------------144461275127242
    Content-Disposition: form-data; name="wysiwygEditorHeight"

    200
    -----------------------------144461275127242
    Content-Disposition: form-data; name="wysiwygEditorMode"

    0
    -----------------------------144461275127242
    Content-Disposition: form-data; name="parseURL"

    1
    -----------------------------144461275127242
    Content-Disposition: form-data; name="enableBBCodes"

    1
    -----------------------------144461275127242
    Content-Disposition: form-data; name="showSignature"

    1
    -----------------------------144461275127242
    Content-Disposition: form-data; name="upload[]"; filename=""
    Content-Type: application/octet-stream


    -----------------------------144461275127242
    Content-Disposition: form-data; name="pollQuestion"


    -----------------------------144461275127242
    Content-Disposition: form-data; name="pollOptions"


    -----------------------------144461275127242
    Content-Disposition: form-data; name="endTimeDay"

    0
    -----------------------------144461275127242
    Content-Disposition: form-data; name="endTimeMonth"

    0
    -----------------------------144461275127242
    Content-Disposition: form-data; name="endTimeYear"

    0
    -----------------------------144461275127242
    Content-Disposition: form-data; name="endTimeHour"

    0
    -----------------------------144461275127242
    Content-Disposition: form-data; name="endTimeMinutes"

    0
    -----------------------------144461275127242
    Content-Disposition: form-data; name="choiceCount"

    1
    -----------------------------144461275127242
    Content-Disposition: form-data; name="activeTab"

    smilies
    -----------------------------144461275127242
    Content-Disposition: form-data; name="preview"

    Vorschau
    -----------------------------144461275127242
    Content-Disposition: form-data; name="postID"

    0
    -----------------------------144461275127242
    Content-Disposition: form-data; name="idHash"

    Sicherheitshalber auch zensiert.
    -----------------------------144461275127242--
    [/hide]
    Das ist der Text, der über das TCP/IP Protokoll an den Server gesendet wird, und so an jedem Router mitgelesen werden kann, durch den die Nachricht durch muss, bis sie angekommen ist. Eigentlich würde ich nun sagen, "wenn du verhindern willst, dass das jemand mitliest, verwende als Protokoll nicht HTTP, sondern HTTPS", aber in letzter Zeit habe ich jede Menge Meldungen gelesen, dass SSL kaputt ist. Trotzdem ist HTTPS immer noch besser, als gar keine Verschlüsselung.