schneerunzel
Goto Top

Übergabe Formularinhalte an externes PHP Script

Hallo zusammen,

ich habe heute eine relativ außergewöhnliche Frage:
Und zwar geht es um folgendes: Ich habe für eine größere Sportveranstaltung ein Buchungssystem für die Teilnehmer. Bei diesem Buchungssystem handelt es sich um ein Plugin für Joomla, das wir leider nicht ohne weiteres ablösen wollen. Es ist eben genau das was wir brauchen.
Leider bietet diese Buchungssystem keine wirkliche Möglichkeit der Zahlung per SEPA Lastschrift. Auch nach Diskussion mit dem Hersteller gab es keine Einigung. Daher habe ich mir selber etwas überlegt:

Ich habe das Buchungssystem, welches auf einem Webserver bei all-inkl läuft. Wenn der Teilnehmer "Lastschrift" auswählt erscheint ein Formular, in dem die Bankverbindung und noch einiges mehr eingegeben werden kann. Wenn nun der Button weiter angeklickt wird, sollen die Inhalte des Formulars an eine anderes PHP Script übergeben werden, welche diese weiter verarbeitet. Der Knackpunkt an der ganzen Sache: das zweite PHP Script liegt nicht auf einem Server bei all-inkl sonder auf einem Server der bei uns im Serverraum steht und uns als Schnittstelle für die Zeiterfassung dient. Auf diesem Server läuft ein Apache der einmal selber so konfiguriert ist, dass nur die IP des all-inkl Servers drauf zugreifen kann und zum anderen wird das ganze auch noch mal von der Sophos Firewall entsprechend geschützt. Dieser Server hat wiederum die Möglichkeit eine Schritt weiter ins Interne Netzwerk zu gehen und die Lastschriften in einer Interne Datenbank abzulegen.

Die Frage lautet also, wie bekomme ich die Daten aus dem Formular an den Internen Server übergeben.
Mir fällt spontan folgendes ein:
ich rufe, mit dem Klick auf "weiter", die URL des Internen Servers nach folgendem Schema auf: https://interner.server.de/sepa/sepa.php?bic=GENDODESSE.....
in der sepa.php fange ich dann die übergeben Parameter ab und baue daraus meinen Datensatz für die Datenbank.
Das finde ich allerdings nicht wirklich schön. Und außerdem könntet ich mir gut vorstellen, das das Sicherheitstechnisch nicht wirklich gut ist....

Ein require_once oder include_once funktioniert natürlich wiederum nicht.
Auch mit Iframe ist mir nicht geholfen, da ja nur die "All-Inkl" IP auf den internen Server zugreifen darf...

Hat jemand eine Idee? Oder eine besseren Vorschlag wie man das ganze eleganter lösen kann als über so eine "PHP-Schnittstelle"

Danke für Eure Hilfe.

Content-Key: 328548

Url: https://administrator.de/contentid/328548

Printed on: April 20, 2024 at 02:04 o'clock

Member: falscher-sperrstatus
falscher-sperrstatus Feb 05, 2017 at 11:12:45 (UTC)
Goto Top
Hallo,

ja, ich würde unbedingt Bankdaten per Get Parameter übertragen...

Zum anderen frage ich mich gerade, warum man einmalige Zahlungen per SEPA ermächtigen sollte - richt Paypal oder Sofortüberweisung ein, das ist sicherer und sinniger.

Ich für meinen Teil gebe doch keinem SEPA Einzugsermächtigung, wenn ich nicht regelmäßig an diese zahle.

VG
Member: schneerunzel
schneerunzel Feb 05, 2017 at 12:31:45 (UTC)
Goto Top
Hallo certifiedit.net,

vielen Dank für deine Antwort.

wir haben selbstverständlich schon über PayPal, Sofortüberweisung und co. Nachgedacht. Nur diese Anbieter haben für uns mehre große Nachteile:
- Erstmal fallen gebühren an. (In Unserem Fall sind das immerhin fast 500€, die nicht eben mal über sind)
- Rechtlich ist das ganze auch nicht ganz einfach, da die Trägergemeinschaft nicht den Zusatz e.V. trägt. (Bei PayPal sind wir damit bereits gescheitert)
- Wir haben viele ältere Teilnehmer bzw. viele die sehr konservativ eingestellt sind was z.B. online Banking angeht.
- Irgendwo müssen wir uns auch mit anderen ähnlichen Veranstaltungen vergleichen, und der Standard ist nun einmal SEPA Lastschrift. Wir sind eine der letzten Veranstaltungen, die nur Rechnungszahlung anbieten. Und den Spaß den ich jedes Jahr mit den Geldeingängen habe, wollte ich mir nicht mehr auf dauer gönnen. (Manchmal glaubt man gar nicht, dass einige nicht in der Lage sind eine Rechnungsnummer bei einer Überweisung anzugeben. Da kann man fast nur Würfeln, zu welcher Buchung dieser Geldeingang gehört....)

Viele Grüße
Mitglied: 132272
132272 Feb 05, 2017 updated at 12:37:26 (UTC)
Goto Top
Per "post" aber hoffentlich nur SSL gesichert! An den CORS Header im Skript denken (Access-Control-Allow-Origin).
JavaScript Variable an PHP per AJAX?

Gruß
Member: schneerunzel
schneerunzel Feb 05, 2017 at 13:04:43 (UTC)
Goto Top
Hallo,

danke für die Antwort.
Aber gerade Post funktioniert ja nicht, das das Script ja auf einem anderen Server liegt.
Oder habe ich deine Antwort jetzt falsch verstanden?

Viele Grüße
Mitglied: 132272
132272 Feb 05, 2017 updated at 13:16:20 (UTC)
Goto Top
Zitat von @schneerunzel:
Aber gerade Post funktioniert ja nicht, das das Script ja auf einem anderen Server liegt.
Oder habe ich deine Antwort jetzt falsch verstanden?
Doch das funktioniert, solange du im PHP-Script welches die Daten empfängt den CORS-Header setzt der genau das zulässt!
header("Access-Control-Allow-Origin: *");  
Statt dem Sternchen setzt man optimalerweise natürlich nur die Domains die Zugriff erhalten sollen.

https://en.m.wikipedia.org/wiki/Cross-origin_resource_sharing
HTTP access control (CORS)
Member: schneerunzel
schneerunzel Feb 05, 2017 at 15:03:05 (UTC)
Goto Top
Ah. Ok.
Aber leider ist das auch nicht das richtige, da das Ergebnis des Formulars nicht vom Server selbst sondern vom Client aus an das PHP Script weiter gegeben wird. Der Client des Users soll allerdings in keinem Fall die Möglichkeit haben, mit dem Internen Server zu kommunizieren.
Wirklich nur die IP des All Inkl Servers darf (laut Firewall Regel) den Internen Server erreichen und dort das Script zur weiter Verarbeitung ausführen.
Mitglied: 132272
132272 Feb 05, 2017 updated at 15:12:57 (UTC)
Goto Top
Zitat von @schneerunzel:

Ah. Ok.
Aber leider ist das auch nicht das richtige, da das Ergebnis des Formulars nicht vom Server selbst sondern vom Client aus an das PHP Script weiter gegeben wird. Der Client des Users soll allerdings in keinem Fall die Möglichkeit haben, mit dem Internen Server zu kommunizieren.
Wirklich nur die IP des All Inkl Servers darf (laut Firewall Regel) den Internen Server erreichen und dort das Script zur weiter Verarbeitung ausführen.

Du hast es falsch verstanden!

Der Server kann das genauso per PHP und Post Request an den anderen übermitteln! Und wenn du es im PHP mit curl machst.
Member: schneerunzel
schneerunzel Feb 05, 2017 at 15:30:19 (UTC)
Goto Top
Dann brauche ich einen kleinen Denkanstoß:

auf dem Webserver prüfe ich das Formular, ob die Felder denn auch ausgefüllt sind (vereinfacht):
if(isset($_REQUEST["kontoinhaber"]) and isset($_REQUEST["strassekdinhaber"]) and isset($_REQUEST["plzkdinhaber"]) and isset($_REQUEST["ortkdinhaber"]) and isset($_REQUEST["iban"]) and isset($_REQUEST["bic"]))  
und dann?
kann ich dann z.B: ein include/include_once oder require_once machen?
also
include 'https://internerserver/sepa.php'  

und in der genannten sepa.php
habe ich dann folgenden Inhalt:
header("Access-Control-Allow-Origin: https://anmeldeportal/anmeldung.php");  
und in dann kann ich mit z.B. $_REQUEST["bic"] die werte Abfragen?
Mitglied: 132272
132272 Feb 05, 2017 updated at 15:45:57 (UTC)
Goto Top
kann ich dann z.B: ein include/include_once oder require_once machen?
Nein, siehe Link in deinem anderen Thread. Ein POST mit file_get_contents oder curl.
http://stackoverflow.com/questions/5647461/how-do-i-send-a-post-request ...
Member: schneerunzel
schneerunzel Feb 05, 2017 at 15:50:32 (UTC)
Goto Top
also auf dem Webserver folgendes:
$url = 'https://internerserver/sepa.php';  
$data = array('iban' => $_REQUEST["iban"], 'bic' => $_REQUEST["bic"]);  

$options = array(
    'https' => array(  
        'header'  => "Content-type: application/x-www-form-urlencoded\r\n",  
        'method'  => 'POST',  
        'content' => http_build_query($data)  
    )
);
$context  = stream_context_create($options);
$result = file_get_contents($url, false, $context);
if ($result === FALSE) { /* Handle error */ }

var_dump($result);
richtig?

und wie verarbeite ich das jetzt auf dem internen Server?
Mitglied: 132272
132272 Feb 05, 2017 updated at 17:19:55 (UTC)
Goto Top
und wie verarbeite ich das jetzt auf dem internen Server?
Ganz normal, das ist so wie wenn du per POST Daten an ein PHP-Script schickst.
Die Daten holst du wie gehabt aus $_POST['feld'] usw..
Member: falscher-sperrstatus
falscher-sperrstatus Feb 05, 2017 at 17:24:47 (UTC)
Goto Top
Darf ich dir die Frage stellen, wie weit du dich mit dem Abfragen (und Absichern) von PHP Auskennst? Denn 500€ können ganz schnell nichts mehr sein, wenn die Daten auf der Straße liegen...
Member: schneerunzel
schneerunzel Feb 05, 2017 at 18:15:50 (UTC)
Goto Top
@certifiedit.net: wie du sicher an meinen Fragen erraten hast habe ich da nicht wirklich viel Ahnung von. Vielen Dank für den Hinweis, trotzdem möchte ich das ganze gerne Umsetzen.

@nachfrage:
ich habe jetzt folgendes umgesetzt:
auf dem Server steht nun folgendes:
$url = 'https://internerserver/sepa.php';  
$data = array('iban' => $_REQUEST["iban"], 'bic' => $_REQUEST["bic"]);  
echo $_REQUEST["iban"];  
$options = array(
    'https' => array(  
        'header'  => "Content-type: application/x-www-form-urlencoded\r\n",  
        'method'  => 'POST',  
        'content' => http_build_query($data)  
    )
);
$context  = stream_context_create($options);
$result = file_get_contents($url, false, $context);
if ($result === FALSE) { /* Handle error */ }

var_dump($result);

und auf dem Internetserver in der sepa.php steht folgendes:
header("Access-Control-Allow-Origin: https://anmelung/anmeldung.php");  

$handle = fopen ("tmp.txt", a);  
fwrite ($handle,  IBAN:".$_POST['iban']);  
fclose ($handle);

leider komme ich immer noch nicht an das Feld iban ran. Was mache ich falsch?
Mitglied: 132272
132272 Feb 06, 2017 updated at 21:54:25 (UTC)
Goto Top
Was mache ich falsch?
Brille aufsetzen:
// use key 'http' even if you send the request to https://...

Und von error_reporting oder Debug-Ausgabe von Variablen hast du wohl auch noch nichts gehört?!

Argh... und so jemanden lässt man auf so ein Projekt los?

Ich bin weg, sowas sollte man nicht auch noch fördern.

Gruß und viel Erfolg beim Basteln.
Member: Herbrich19
Solution Herbrich19 Feb 06, 2017 at 19:41:43 (UTC)
Goto Top
Hallo,

Ich würde über curl die url des internen servers aufrufen und die Parameter wie du schon schreibst in GET übertragen. Sicherheitstechnisch ist es egal solange TLS (umgangssprachlich SSL) genutzt wird. Die GET Paramter sind auch im Crypto Stream also sicher vor fremden einblicken.

Trotzdem würde ich aber auf den Internen Server sowohl auf den al-ink server die eingaben alle escapen um bad requests (Hacker Angriffe, naja Script Kiddi Angriffe) zu verhindern.

Gruß an die IT-Welt,
J Herbrich