Alex: SQL-Befehle per <textarea>

Hallo,
ich würde gerne in ein PHP-Skript eine Funktion einbauen, damit man über eine Textarea SQL-Befehle eingeben kann und diese dann ausgeführt werden.

Also man gibt z.B. sowas ein:
INSERT INTO tabelle VALUES (...);
INSERT INTO tabelle VALUES (...);
usw...

Ich dachte dann, das Skript packt die Befehle in einen Array und diese werden dann mit einer FOR-Schleife abgearbeitet, etwa so:

for($x=0; $x<count($commands); $x++)
 {
  mysql_query($commands[$x], $connid);
 }

Meine Frage ist nun: Wie bekomme ich die Befehle korrekt in den Array? Vielleicht irgendwie mit $commands = explode(";", $_POST['textarea'])? Ist aber etwas grob, da ja auch innnerhalb der Befehle ein ";" vorkommen kann.
Hat jemand eine bessere Idee?

Jedenfalls schon mal Danke!
Alex

  1. Halihallo Alex

    ich würde gerne in ein PHP-Skript eine Funktion einbauen, damit man über eine Textarea SQL-Befehle eingeben kann und diese dann ausgeführt werden.

    Dir ist bewusst, dass dann auch jeder DELETE eingeben kann?

    Meine Frage ist nun: Wie bekomme ich die Befehle korrekt in den Array? Vielleicht irgendwie mit $commands = explode(";", $_POST['textarea'])? Ist aber etwas grob, da ja auch innnerhalb der Befehle ein ";" vorkommen kann.

    Dann musst du einen eigenen Parser schreiben, der alles innerhalb von " oder ' maskiert.

    Viele Grüsse

    Philipp

    1. Halihallo

      ich würde gerne in ein PHP-Skript eine Funktion einbauen, damit man über eine Textarea SQL-Befehle eingeben kann und diese dann ausgeführt werden.
      Dir ist bewusst, dass dann auch jeder DELETE eingeben kann?

      und phpMyAdmin kennst du, oder? - Nur um sicherzugehen.

      Meine Frage ist nun: Wie bekomme ich die Befehle korrekt in den Array? Vielleicht irgendwie mit $commands = explode(";", $_POST['textarea'])? Ist aber etwas grob, da ja auch innnerhalb der Befehle ein ";" vorkommen kann.

      Dann musst du einen eigenen Parser schreiben, der alles innerhalb von " oder ' maskiert.

      alles => alle ';''s.

      ---

      Was willst du eigentlich damit machen? - Wäre ein etwas "schöneres" Frontend nicht
      besser (und wesentlich sicherer)?

      Viele Grüsse

      Philipp

      1. Hallo,

        und phpMyAdmin kennst du, oder? - Nur um sicherzugehen.

        ...klar kenne ich das. So eine ähnliche Funktion wie "SQL" hätte ich eben gerne in einem Script, um mal schnell etwas in der DB zu ändern ohne daß ich erst über phpMyAdmin ran muss.
        Ich hab mir auch schon "read_dump.php" abgeschaut, steige da aber nicht ganz durch - und ich bräuchte auch nur was ganz einfaches.
        Einfach den Array über die ";" zu definieren ist aber zu wenig, falls in einem der VALUES ein ";" vorkommt...

        Alex

    2. Hallo,

      Dir ist bewusst, dass dann auch jeder DELETE eingeben kann?

      ...naja, das geht natürlich nur, wenn man eingelogged ist!

      Alex

  2. Wo ist das Problem? Du hast ja mit dem Semikolon ein gutes Trennzeichen um ein Array zu beladen. Du musst nur noch die Leerzeichen trimmen und dann kannst du die SQL-Statements in deiner for-Schleife abarbeiten.

    Du musst aber sehr vorsichtig sein in deiner Schleife und bei Fehlern aussteigen.

    1. Halihallo Robert

      Wo ist das Problem? Du hast ja mit dem Semikolon ein gutes Trennzeichen um ein Array zu beladen. Du musst nur noch die Leerzeichen trimmen und dann kannst du die SQL-Statements in deiner for-Schleife abarbeiten.

      INSERT INTO tabelle (Name) VALUES ('Hasenfratz;Philipp');

      und schon kriegst du Müll und öffnest Crackern eine Hintertür!

      Viele Grüsse

      Philipp

    2. Wo ist das Problem? Du hast ja mit dem Semikolon ein gutes Trennzeichen um ein Array zu beladen. Du musst nur noch die Leerzeichen trimmen und dann kannst du die SQL-Statements in deiner for-Schleife abarbeiten.

      ...ja, so weit war ich auch schon. Das Problem ist, daß es solche Eingaben geben könnte:
      INSERT INTO tabelle VALUES ('Hallo; wie geht's?','usw...');
      Alex

      1. Wo ist das Problem? Du hast ja mit dem Semikolon ein gutes Trennzeichen um ein Array zu beladen. Du musst nur noch die Leerzeichen trimmen und dann kannst du die SQL-Statements in deiner for-Schleife abarbeiten.
        ...ja, so weit war ich auch schon. Das Problem ist, daß es solche Eingaben geben könnte:
        INSERT INTO tabelle VALUES ('Hallo; wie geht's?','usw...');
        Alex

        Naja, dann eben mit Regulären Ausdrücken ;)

  3. Moin Moin !

    Du willst Dir mit Gewalt in den Fuß schießen, oder?

    Nicht, daß ich sowas nicht auch schon gebaut hätte. Da kommt man aber entweder nur innerhalb von sicheren Netzen (Single-User-LAN hinter einer Firewall) oder nach einem Login als Superuser des jeweiligen Systems ran. Und das erste, was ich bei der Login-Variante bis zum Wahnsinn versucht habe, war, das Login auszuhebeln.

    Mit anderen Worten: *Ich* weiß, was ich mit solchen Aktionen tue. Den Eindruck habe ich bei Dir leider nicht.

    Und weil ich weiß, was ich mit solchen Tools anrichten kann, habe ich mir mit Parametern auch keine Mühe gegeben: Der Inhalt der Textarea geht 1:1 direkt in die Datenbank, ohne jedes Escaping. Das ist in dem Fall der Job des Superusers.

    Für die massenhafte Datenverarbeitung habe ich ohnehin andere Wege (auch über HTTP).

    Alexander

    --
    Nein, ich beantworte keine Fragen per eMail. Dafür ist das Forum da.
    Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so!"
    1. Hallo,

      klar, das ist nur für den Admin gedacht!

      Alex

      1. Moin Moin !

        klar, das ist nur für den Admin gedacht!

        Ja, aber kannst Du sicherstellen, daß da auch nur der Admin rankommt?

        Und wenn ja: Der Admin kennt das System. Warum soviel Mühe, wenn Du das SQL-Kommando auch gleich aus der Textarea in die DB drücken kannst?

        Alexander

        --
        Nein, ich beantworte keine Fragen per eMail. Dafür ist das Forum da.
        Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so!"
        1. Hallo,

          Ja, aber kannst Du sicherstellen, daß da auch nur der Admin rankommt?

          ...naja, das ist mit SESSIONS geregelt. Wer das PW kennt, kommt natürlich überal rein - auch in phpMyAdmin.

          Und wenn ja: Der Admin kennt das System. Warum soviel Mühe, wenn Du das SQL-Kommando auch gleich aus der Textarea in die DB drücken kannst?

          ...ja, ehrlich gesagt brauch ich das selber auch nicht, ich wurde aber gebeten, eine entsprechende Funktion für dieses Foren-Skript einzubauen: http://alex.ilosuna.org/forum.html
          Man soll damit als Admin die Daten einfach sichern und wieder hochladen können.
          Ich bin bereits soweit, daß man sich den SQL-Dump ausgeben lassen und z.B. in phpMyAdmin wieder in die DB speichern kann. Letzteres hätte ich halt acu gern im eigenen Programm...

          Alexander

          Alex ;-)

  4. Hallo Alex,

    Hat jemand eine bessere Idee?

    $cmdtext = $_POST['command'];
    $commands = array();
    $curcmd = '';
    $squote = false;
    $dquote = false;
    for ($i = 0; $i < strlen ($cmdtext); $i++) {
      switch ($cmdtext{$i}) {
        case ''':
          if ($squote) {
            $squote = false;
          } else if (!$dquote) {
            $squote = true;
          }
          break;
        case '"':
          if ($dquote) {
            $dquote = false;
          } else if (!$squote) {
            $dquote = true;
          }
          break;
        case ';':
          if (!$squote && !$dquote) {
            $commands[] = $curcmd;
            $curcmd = '';
            continue;
          }
          break;
        case '\':
          $curcmd .= $cmdtext{$i++};
          break;
        default:
          break;
      }
      $curcmd .= $cmdtext{$i};
    }

    if (trim ($tmp) != '') {
      $commands[] = $curcmd;
    }

    var_dump ($commands);

    Ich übernehme natürlich keine Haftung.

    Viele Grüße,
    Christian

    --
    Hast Du einen Beitrag? Nur her damit!
    http://aktuell.de.selfhtml.org/tippstricks/beitrag.htm
    SELF-Code: (http://emmanuel.dammerer.at/selfcode.html)
    sh:) fo:) ch:] rl:( br:> n4:& ie:% mo:) va:) de:] zu:) fl:( js:| ss:) ls:[
    1. Hallo,
      Danke, das sieht schon mal ganz gut aus! Ich verstehe es nur nur nicht ganz ;-) - z.B. scheint $tmp immer undefiniert zu sein?!
      Alex

      1. Hallo Alex,

        z.B. scheint $tmp immer undefiniert zu sein?!

        Ups - da habe ich doch glatt etwas vertan... (kommt davon, wenn man nach C&P etwas verändert)

        Die Zeile sollte lauten:

        if (trim ($curcmd) != '') {

        Was ich an sich mache: ich gehe den ganzen String durch und schau nach dem Semikolon. Außerdem merke ich mir noch die Zustände. (innerhalb einer 'einfachen' Zeichenkette, innerhalb einer "doppelten" Zeichenkette) Naja, und mit $zeichenkette{$index} kann ich auf ein beliebiges Zeichen zurückgreifen.

        Hoffentlich ist es jetzt etwas klarer.

        Viele Grüße,
        Christian

        --
        Hast Du einen Beitrag? Nur her damit!
        http://aktuell.de.selfhtml.org/tippstricks/beitrag.htm
        SELF-Code: (http://emmanuel.dammerer.at/selfcode.html)
        sh:) fo:) ch:] rl:( br:> n4:& ie:% mo:) va:) de:] zu:) fl:( js:| ss:) ls:[