Dred: SQLite3 - Fragen: ALTER TABLE und co

Hallo,

mehrere Probleme:
a) möchte ALTER TABLE einmalig ausführen zum Umbenennen einer Table und finde nicht die Syntax. Hier (sqlite.org) finde ich leider nicht alle Hilfe. Es ist eher ein Nachschlagewerk, wenn man die Sprache beherrscht. Es geht um database-name (siehe Link). Was ist das? Ich möchte den Befehl einmalig im SQLite Database Browser 2.0b1 eingeben. Nicht in php (wo ich die Datenbanken normalerweise verarbeite).

b) wofür steht 'stmt' in alter-table-stmt.

c) Wenn ich, um Injektionenn zu verhindern, die php Funktion escapeString verwende, muss ich das dann auf jedes Glied einzeln anwenden? Beispiel: meine GetRecord() - Funktion kriegt die Parameter: $table, $index, $item und baut dann sowas wie
$query = "SELECT * FROM $table WHERE $index='$item';
Ich habe jetzt die escapeSring davor gesetzt:

$table   = $this->escapeString($table);  
$index   = $this->escapeString($index);  
$item    = $this->escapeString($item);

Denn wenn ich es auf den fertigen $query anwende, kriege ich Probleme, weil da ja von Hause aus schon ' drin sind, die da auch sein sollen. Das Problem ist, dass das gute php.net für SQLite3::escapeString im Kommentar sagt:

Calling this function on user input BEFORE constructing the query string can lead to interesting results.  For instance, it truncates e-mail addresses in an un-usable manor.

Das finde ich widersprüchlich und verwirrt mich, weil ich noch SQLite-Anfänger bin.

d) Generell frage ich mich auch, wo ich bei der SELECT-query Hochkommas nutzen soll, wo darf, wo muss. Und ob ich mich ausreichend schütze.

Kennt jemand ein Tutorium für Sqlite3, welches fortgeschrittene Anwendungsfälle zeigt (unter Benutzung mit php). Ich finde nur Beispiele, wo die Datenbank geöffnet wird, etc. Nicht aber, wo die Sicherheit behandelt wird. www.sqlite.org wie gesagt, ist eher ein Nachschlagewerk, das sicher allumfassend ist, dass mir aber den Einstieg nicht ermöglicht. Gerne auch Englisch...

Grüße und Dank...

  1. Hi,

    a) möchte ALTER TABLE einmalig ausführen zum Umbenennen einer Table und finde nicht die Syntax. Hier (sqlite.org) finde ich leider nicht alle Hilfe.

    ALTER TABLE table-name RENAME TO new-table-name

    • das ist doch direkt an der von dir verlinkten Stelle ziemlich deutlich heraus zu lesen?

    Es geht um database-name (siehe Link). Was ist das?

    Der Name der Datenbank, was denn sonst?

    b) wofür steht 'stmt' in alter-table-stmt.

    Für Statement.

    c) Wenn ich, um Injektionenn zu verhindern, die php Funktion escapeString verwende, muss ich das dann auf jedes Glied einzeln anwenden?

    Daten müssen dem Escaping unterzogen werden.

    MfG ChrisB

    --
    RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
    1. Hallo ChrisB, danke für Deine Anwesenheit :)

      ALTER TABLE table-name RENAME TO new-table-name

      • das ist doch direkt an der von dir verlinkten Stelle ziemlich deutlich heraus zu lesen?

      m.E. eben nicht. Da...

      Es geht um database-name (siehe Link). Was ist das?

      Der Name der Datenbank, was denn sonst?

      Den Du in dem ALTER TABLE Befehl aber _nicht_ verwendest (womit es übrigens geklappt hat). Wenn ich dieses Schema sehe

      ALTER TABLE <database-name> . <table-name> RENAME TO <new-table-name>

      dann denke ich doch, dass ich die Platzhalter ausfüllen muss. Nun denn. Ich bin wohl zu genau. Es klappte, wie Du schriebst.

      c) Wenn ich, um Injektionenn zu verhindern, die php Funktion escapeString verwende, muss ich das dann auf jedes Glied einzeln anwenden?

      Daten müssen dem Escaping unterzogen werden.

      Was meinst Du damit? Kannst Du auf die Unterscheidung in meinem OP bitte nocheinmal eingehen?
      Meinst Du mit "Daten" nur bei Querys wie INSERT INTO und dergleichen und dass ich sie bei Abfragequerys wie SELECT nicht benötige? Vielen Dank.

      1. Hi,

        Der Name der Datenbank, was denn sonst?

        Den Du in dem ALTER TABLE Befehl aber _nicht_ verwendest (womit es übrigens geklappt hat). Wenn ich dieses Schema sehe

        ALTER TABLE <database-name> . <table-name> RENAME TO <new-table-name>

        dann denke ich doch, dass ich die Platzhalter ausfüllen muss.

        Nein, musst du nicht - deshalb führt im Syntax-Diagramm ein Pfeil darunter entlang. Der stellt einen alternativen Weg zu dem Weg "über" den Datenbank-Namen dar.

        Nun denn. Ich bin wohl zu genau.

        Nein, du hast das Syntax-Diagramm nur nicht korrekt interpretiert.

        Wie solche Syntax-Diagramme generell aufgebaut sind und was sie aussagen, kannst du bspw. bei der Wikipedia nachlesen: http://en.wikipedia.org/wiki/Syntax_diagram

        c) Wenn ich, um Injektionenn zu verhindern, die php Funktion escapeString verwende, muss ich das dann auf jedes Glied einzeln anwenden?

        Daten müssen dem Escaping unterzogen werden.

        Was meinst Du damit? Kannst Du auf die Unterscheidung in meinem OP bitte nocheinmal eingehen?
        Meinst Du mit "Daten" nur bei Querys wie INSERT INTO und dergleichen und dass ich sie bei Abfragequerys wie SELECT nicht benötige?

        Nein, sondern jedes Datum, das du in irgendeine Query einfügst.

        MfG ChrisB

        --
        RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
        1. Nein, sondern jedes Datum, das du in irgendeine Query einfügst.

          Enspricht dies der Methode, wie ich es bereits mache?

          Liebe Grüße und vielen Dank für die Anwort.

  2. Hi!

    c) Wenn ich, um Injektionenn zu verhindern, die php Funktion escapeString verwende, muss ich das dann auf jedes Glied einzeln anwenden?

    Du solltest verstehen, wie Injectionen funktionieren, dann sollte sich die Frage von selbst erübrigen. Mal wieder ein Fall für den Kontextwechsel-Artikel.

    Beispiel: meine GetRecord() - Funktion kriegt die Parameter: $table, $index, $item und baut dann sowas wie

    $query = "SELECT * FROM $table WHERE $index='$item';
    Ich habe jetzt die escapeSring davor gesetzt:

    $table   = $this->escapeString($table);

    $index   = $this->escapeString($index);
    $item    = $this->escapeString($item);

      
    $table und $index sind aus Sicht des Statements keine String-Literale, dürfen also nicht als solche behandelt werden. Ob die Verwendung von Bezeichner-Begrenzungszeichen in Bezeichnern gestattet ist, hab ich nicht herausgefunden. Wenn du so eine allgemeine Funktion schreibst, die potentiell Bezeichner mit enthaltenen Begrenzungszeichen erwarten muss, solltest du auf diese prüfen und entweder eine weitere Verarbeitung ablehnen oder sie maskieren, wenn du dazu findest, wie das geht.  
      
    
    > Das Problem ist, dass [das gute php.net für SQLite3::escapeString](http://www.php.net/manual/de/sqlite3.escapestring.php#101887) im Kommentar sagt:  
    > >> Calling this function on user input BEFORE constructing the query string can lead to interesting results.  For instance, it truncates e-mail addresses in an un-usable manor.  
    > Das finde ich widersprüchlich und verwirrt mich, weil ich noch SQLite-Anfänger bin.  
      
    Da der User-Kommentar nichts genaues schreibt, ist das nicht nachvollziehbar. Vielleicht hat er einfach nur einen Fehler gemacht und schiebt das aus Unkenntnis auf diese Funktion.  
      
    
    > d) Generell frage ich mich auch, wo ich bei der SELECT-query Hochkommas nutzen soll, wo darf, wo muss. Und ob ich mich ausreichend schütze.  
      
    <http://www.sqlite.org/lang_keywords.html>  
      
    Hochkommas kennzeichnen String-Literale. Alle String-Literale müssen in Hochkommas eingefasst werden. Für Bezeichner gibt es eigene Begrenzungszeichen, die nur dann erforderlich sind, wenn sie mit Schlüsselwörtern verwechselt werden können oder Zeichen enthalten, die zum Beispiel für Operatoren verwendet werden. Umgehen kann man das durch die Verwendung nicht reservierter Namen und die Vermeidung solcher Zeichen. Aber es ist manchmal Mist, wenn man sich einen Namen aus den Fingern saugen muss, der nicht richtig zum Anwendungszweck passt, dafür aber nicht mit einem Keyword kollidiert.  
      
    Da du eine allgemeine Funktion schreibst, solltest du alle variablen Bezeichner in "" einrahmen und sie auf Vorkommen von " testen.  
      
    
    > Kennt jemand ein Tutorium für Sqlite3, welches fortgeschrittene Anwendungsfälle zeigt (unter Benutzung mit php). Ich finde nur Beispiele, wo die Datenbank geöffnet wird, etc. Nicht aber, wo die Sicherheit behandelt wird.  
      
    Sicherheit gegen Injektionen arbeitet überall nach dem gleichen Prinzip: Kontextwechsel beachten. Andere Arten von Sicherung wären solche gegen unberechtigten Zugriff oder zum Beispiel DOS-Angriffe.  
      
      
    Lo!