dedlfix: SQLite3 - Fragen: ALTER TABLE und co

Beitrag lesen

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!