lulu: QUERY per POST-Request an anderen Server schicken

Hallo

wollte mal Eure Meinung zu folgender Idee hören:

Um Daten von einem Server zum nächsten zu befördern möchte ich einen
simplen POST-Request benutzen.
In erster Linie habe ich das für SQL-Daten gedacht die von einem zentralen
Host aus auf mehrere 0815-WebSpace-Pakete verteilt werden.
In der Regel hat man da ja keinen Remote Zugriff auf die MySQL-Datenbank.

Hintergrund dabei ist, dass ich ein zentrales Web-Interface (das nenne ich mal Mutter) zur Datenpflege für mehrere Freunde/ Kunden/ Mandanten/ wie auch immer (die nenne ich mal Konten) aufsetzen will .

Es geht dabei konkret um kleinste bis kleinere Webseiten (die nenne ich mal Kinder).

Es soll also eine Aktualisierung der Kinderdatenbanken von einer
zentralen Mutterdatenbank aus stattfinden.
(Nur in dieser Richtung)

Ich verspreche mir davon, das ich

1. nicht ständig auf allen möglichen WebHostingPakten mein kleines
WCMS aktualisieren muss

2. ich bei den Kindern trotzdem die Datenbanken benutzen kann

3. bei Verbesserungen, Korrekturen etc. am zentralen WCMS sofort alle Konten profitieren. (Klar, bei Fehlern leiden dann auch alle gemeinsam ;-) )

4. ich den SourceCode schön geheim halten kann (Pfui, und dann die Festplatte mit all den schönen OpenSource-Entwicklungen vollstopfen)

Das erstmal als erste Idee, die kann man natürlich noch weiterspinnen

Unter der Voraussetzung das

a) Innerhalb der zu übertragenden Querys/ Daten keine sensiblen
   Informationen stehen (also keine Passwörter, Kreditkarteninfos, Kundendaten etc.)

b) die Datenmengen eher gering sind

c) die Komplexität der Datenbankstrukturen sehr gering anzusetzen ist

d) der geheime Schlüssel je Konto unterschiedlich und geheim ist

... ist diese Idee dann

a) total dämlich

b) super toll

c) wenn Dir das Spass macht dann mach es halt so

d) ein alter Hut das gibt es doch schon bei ____ und bei ___

e) wasserdicht, zumindest was unerwünschte Injektionen angeht

f) sehr gefährlich weil Du nicht daran gedacht hast dass ____

g) schieb die Daten doch per FTP rüber

h) Du kennst wohl das Perl-Modul _____ nicht

i) viel zu umständlich, mach doch einfach _____

k) _____

Hier mal mein vorläufiges Ergebnis, ich habe einen einfachen "Sender"
z.Zt. noch als Formular und einen "Empfänger" der guckt ob die Daten ok sind.

<?php
/*
* sender.php
* ============
*/

$ReceiverHost = 'examplehost.net';
$ReceiverPath = '/receiver.php';

$SecretKey = 'geh31m';

// FUNCTIONS (stolen from http://php-faq.de)

function PostToHost($host, $path, $referer, $data_to_send)
{
  $fp = fsockopen($host, 80);
  fputs($fp, "POST $path HTTP/1.1\r\n");
  fputs($fp, "Host: $host\r\n");
  fputs($fp, "Referer: $referer\r\n");
  fputs($fp, "Content-type: application/x-www-form-urlencoded\r\n");
  fputs($fp, "Content-length: ". strlen($data_to_send) ."\r\n");
  fputs($fp, "Connection: close\r\n\r\n");
  fputs($fp, $data_to_send);

while(!feof($fp)) {
      $res .= fgets($fp, 128);
  }
  fclose($fp);

return $res;
}

// MAIN

if (isset($_POST['ISSEND'])){

$QueryToSend = $_POST['QUERY'];
 $KeyToSend = md5($SecretKey.$QueryToSend);
 $DataToSend = 'QUERY='.$KeyToSend.$QueryToSend;

// POST-Request absetzen

$x = PostToHost(
  $ReceiverHost,
  $ReceiverPath,
  "SENDER WAS HERE",
  $DataToSend
 );

echo $x;
}

$html = <<< EOT
<html>

<form action="{$_SERVER['PHP_SELF']}" method="post">
<input type="hidden" name="ISSEND" value="true">
<textarea name="QUERY"></textarea>
<input type="submit" value="send">
</form>
</html>

EOT;

print $html;

?>

<?php
/*
* receiver.php
* ============
*/

$SecretKey = 'geh31m';

$DataIsValid = false;

$DataReceived = isset ($_POST['QUERY'])
 ? $_POST['QUERY']
 : false;

if ($DataReceived){

$KeyReceived = substr($DataReceived, 0, 32);
 $QueryReceived  = substr($DataReceived, 32);
 $KeyToCompare  = md5($SecretKey.$QueryReceived);
 $DataIsValid  = ($KeyToCompare == $KeyReceived);
}

if ($DataIsValid) {

echo "DATA_VALID";
}else{

echo "DATA_INVALID";
}
?>

Danke für Eure Anregungen und Kommentare.

Viele Grüße

lulu

--
bythewaythewebsuxgoofflineandenjoytheday
  1. hi,

    i) viel zu umständlich, mach doch einfach _____

    warum sendest du die daten nicht direkt per POST-formular mit action="http://dein-entfernter-server.example.com/verarbeitendes-script.php" ...?

    gruß,
    wahsaga

    --
    "Look, that's why there's rules, understand? So that you _think_ before you break 'em."
    1. Hi wahsaga

      i) viel zu umständlich, mach doch einfach _____

      warum sendest du die daten nicht direkt per POST-formular mit action="http://dein-entfernter-server.example.com/verarbeitendes-script.php"

      Naja, eigentlich mach ich ja auch nichts anderes.
      Ich möchte halt nur sicherstellen, das man da keinen Unfug mit treiben kann und nicht nur eine einzelne Query sondern ggf. auf "Knopfdruck" auch mal einen kleinen Dump übertragen.

      Z.B. so

      Auf dem Mutterhost liegt das kleine WCMS.
      In der Datenbank dort liegen die Daten für kleine Webseite (< 100 Seiten)

      Auf dem Kindserver liegt dann eigentlich nur

      ein kleines Skript welches z.B. per modrewrite angefordert wird und alle Seiten dynamisch aus Templates erzeugt und mit Content aus der Datenbank füllt und ggf. cached.

      Die Kinddatenbank wird dann z.B. per "Knopfdruck" innerhalb des WCMS
      mit den aktuellen Daten beglückt.

      Ok man könnte auch die Seiten auf dem Mutterhost erzeugen und z.B. per FTP rüberschieben.

      Bisher habe ich halt immer alles auf dem jeweiligen Host liegen
      WCMS, Datenbank, Skripte, Templates etc. .

      Das macht die Sache sehr wartungsintensiv, daher habe ich gerade diese Idee im Kopf es mal mit einem "zentralistischem" Ansatz zu versuchen.

      Viele Grüße

      lulu

      --
      bythewaythewebsuxgoofflineandenjoytheday
      1. Hello,

        Naja, eigentlich mach ich ja auch nichts anderes.
        Ich möchte halt nur sicherstellen, das man da keinen Unfug mit treiben kann und nicht nur eine einzelne Query sondern ggf. auf "Knopfdruck" auch mal einen kleinen Dump übertragen.

        Du kannst doch alles übertagen. Du musst doch auf dem Ziel-Host nur sicherstellen, dass es keine Fälschung ist. dazu kannst Du die diversen proprietären Prüfverfahren einbauen. Je proprietärer, desto sicherer, es sei denn, Du entwickelst die hier öffentlich im Forum *gg*

        Harzliche Grüße aus http://www.annerschbarrich.de

        Tom

        --
        Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
        Nur selber lernen macht schlau
        1. Huhu Tom

          Du kannst doch alles übertragen. Du musst doch auf dem Ziel-Host nur sicherstellen, dass es keine Fälschung ist. dazu kannst Du die diversen proprietären Prüfverfahren einbauen. Je proprietärer, desto sicherer, es sei denn, Du entwickelst die hier öffentlich im Forum *gg*

          Mmmh, entwickeln?
          Ich dachte ich wäre schon fertig.
          Also ein String den nur Empfänger und Sender kennen und MD5() sollten ausreichend sein, zumindest für meine Zwecke.
          Üblicherweise ist ja bei den 0815-Paketen die post_max_size bei 8MB, bzw. bei den geizigeren bei nur 2 MB.

          Das reicht aber immer noch locker um da die Daten einer kleineren Webseite zu übertragen.

          Mal schauen vielleicht setzte ich das demnächst mal versuchsweise so um.

          So jetzt aber endlich, ähh wie heisst es bei Löwenzahn, ach ja  _abschalten_.

          Viele Grüße

          lulu

          --
          bythewaythewebsuxgoofflineandenjoytheday
          1. Hello,

            Üblicherweise ist ja bei den 0815-Paketen die post_max_size bei 8MB, bzw. bei den geizigeren bei nur 2 MB.

            Das reicht aber immer noch locker um da die Daten einer kleineren Webseite zu übertragen.

            Mal schauen vielleicht setzte ich das demnächst mal versuchsweise so um.

            Wer hindert Dich daran, 10 Posts zu schicken, und die dann zusammenzubauen.

            Du musst doch das nur mit LuToDaCTP[1] machen

            [1] Lulu Tom Data and Command Transfer Protocol

            Harzliche Grüße aus http://www.annerschbarrich.de

            Tom

            --
            Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
            Nur selber lernen macht schlau
            1. Huhu Tom

              Wer hindert Dich daran, 10 Posts zu schicken, und die dann zusammenzubauen.

              Das senden der Daten per Post ist gar nicht das Problem, man kann die
               ja auch als Dateiupload schicken und ggf. noch zippen.
              Btw. das muss man ab einer gewissen Größe sowieso, da man ja die Daten sonst urlencoden muss.

              Da gab es ab ca. 1 MB erste "max allocate memory"-Probleme.

              Wenn man es schrittweise macht und in eine Datei schreibt geht es
              aber auch mit größeren Querys.
              Das waren aber nur die ersten Versuche, wenn man es als Dateiupload schickt braucht man das ja nicht mehr machen.

              Habe noch was gelernt:

              http://dev.mysql.com/doc/mysql/en/Packet_too_large.html

              Bei meinem Host ist das max_allowed_packet 1.047.552.

              Also kann man nicht große insert bzw. replace statements einfach als eine query schicken.

              Braucht man ja auch gar nicht.
              Mit "load data local infile" geht das ja viel einfacher und effizienter.

              Also reduziert sich das ganze auf einen CSV-Dump, den man in eine Datei zipped und per Post übergibt.
              Auf der anderen Seite gucken ob die Checksumme stimmt und dann
              per load file in die Datenbank, die man ggf. vorher noch leert.

              Irgendwie ist es ja doch ganz schön trivial, aber vielleicht kann man das ja wirklich zu irgend etwas gebrauchen.

              Viele Grüße

              lulu

              --
              bythewaythewebsuxgoofflineandenjoytheday
              1. Hello LuLu,

                Also kann man nicht große insert bzw. replace statements einfach als eine query schicken.

                Deshalb teilt mysql-Front z.B. immer nach 256 Datensätzen das Statement auf.
                Ganz vorsichtige gehen sogar so weit, dass sie explizit die Input-Buffers flashen lassen.

                Braucht man ja auch gar nicht.
                Mit "load data local infile" geht das ja viel einfacher und effizienter.

                Also reduziert sich das ganze auf einen CSV-Dump, den man in eine Datei zipped und per Post übergibt.
                Auf der anderen Seite gucken ob die Checksumme stimmt und dann
                per load file in die Datenbank, die man ggf. vorher noch leert.

                Und solange sperrt für Otto-Normal, damit der nicht dazwischen funkt.

                Harzliche Grüße aus http://www.annerschbarrich.de

                Tom

                --
                Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                Nur selber lernen macht schlau
  2. Hello,

    k) hättest Du diese interessante Frage nicht ein Hefeweizen früher stellen können?

    Ich werde mich mal am Wochenende damit beschäftigen, sollte es dann noch aktuelle sein...
    Im Zweifelsfall tritt mir am Montag sanft auf die Füße.

    Harzliche Grüße aus http://www.annerschbarrich.de

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    Nur selber lernen macht schlau