Benutzer-Werkzeuge

Webseiten-Werkzeuge


datenbank:postgresql_12

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen RevisionVorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
datenbank:postgresql_12 [2022-05-04 00:27:30] – [Beispiel] manfreddatenbank:postgresql_12 [2022-05-29 01:28:41] (aktuell) – [Syntax gegen SQL-Injektion] manfred
Zeile 131: Zeile 131:
   > su - postgres -c 'psql postgres -l'   > su - postgres -c 'psql postgres -l'
  
-Tabelle "video" anlegen //(es ist nur eine einzige Tabelle, eigentlich müsste sie bis zur 3. Normalform normalisiert werden und somit in 2 Tabellen aufgeteilt werden)//:+Tabelle "video" mit [[https://www.postgresqltutorial.com/postgresql-tutorial/postgresql-serial/|Autoincrement]] (''SERIAL''anlegen //(es ist nur eine einzige Tabelle, eigentlich müsste sie bis zur 3. Normalform normalisiert werden)//:
   > su - postgres -c 'echo "CREATE TABLE video (id SERIAL, inode INT, quersumme VARCHAR(1000), dateiname VARCHAR(10000));" | psql mm_oeffentlich'   > su - postgres -c 'echo "CREATE TABLE video (id SERIAL, inode INT, quersumme VARCHAR(1000), dateiname VARCHAR(10000));" | psql mm_oeffentlich'
   CREATE TABLE   CREATE TABLE
Zeile 157: Zeile 157:
   ----+---------+-----------+-----------   ----+---------+-----------+-----------
     1 | 1234567 | asdfghjkl | Film.mkv     1 | 1234567 | asdfghjkl | Film.mkv
 +  (1 row)
 +
 +Tabelleninhalt zählen:
 +  > su - postgres -c "echo \"SELECT COUNT(*) FROM video;\" | psql -d mm_oeffentlich"
 +   count 
 +  -------
 +       1
   (1 row)   (1 row)
  
Zeile 166: Zeile 173:
   > su - postgres -c 'echo "CREATE TABLE video (id SERIAL, inode INT, quersumme VARCHAR(1000), dateiname VARCHAR(10000));" | psql mm_oeffentlich'   > su - postgres -c 'echo "CREATE TABLE video (id SERIAL, inode INT, quersumme VARCHAR(1000), dateiname VARCHAR(10000));" | psql mm_oeffentlich'
   CREATE TABLE   CREATE TABLE
 +
 +
 +==== Syntax gegen SQL-Injektion ====
 +
 +Um SQL-Injektion zu verhindern, dürfen die Variablen nicht durch ''echo'' ausgegeben werden.
 +Um sie dennoch an den Datenbank-Client übergeben zu können, werden die Optionen ''\z'' (plSQL), ''%%--z%%'' oder ''-v'' verwendet.
 +
 +<code bash>
 +VERZEICHNIS="$(echo "${VERZEICHNIS}" | sed "s/[']/''/g")"
 +DATEINAME="$(echo "${DATEINAME}" | sed "s/[']/''/g")"
 +
 +echo "INSERT INTO video (dateigröße_in_mib,spieldauer,auflösung,tonspuren,untertitelspuren,inode,quersumme,verzeichnis,dateiname,beschreibung) VALUES (:DATEIGROESSE, :VIDEOLAENGE, :AUFLOESUNG, :AUDIO_SPUREN, :UNTERTITEL_SPUREN, :INODE, :Q, :VERZEICHNIS, :DATEINAME, :BESCHREIBUNG);" | psql -U mmroot -d mm_oeffentlich
 + -v DATEIGROESSE="'${DATEIGROESSE}'" -v VIDEOLAENGE="'${VIDEOLAENGE}'" -v AUFLOESUNG="'${AUFLOESUNG}'" -v AUDIO_SPUREN="'${AUDIO_SPUREN}'" -v UNTERTITEL_SPUREN="'${UNTERTITEL_SPUREN}'" -v INODE="'${INODE}'" -v Q="'${Q}'" -v VERZEICHNIS="'${VERZEICHNIS}'" -v DATEINAME="'${DATEINAME}'" -v BESCHREIBUNG="'${BESCHREIBUNG}'"
 +</code>
 +
 +Die doppelte Einfassung, einmal mit doppelten und dann noch einmal mit einfachen Hochkommas, hat den Sinn, dass die doppelten Hochkommas für die SHELL sind und die einfachen Hochkommas für SQL.
 +
 +Die ersten beiden Zeilen im Beispiel-Kode, verändern den Inhalt der Variablen ''VERZEICHNIS'' und ''DATEINAME'' insofern, dass bereits vorhandene einfache Hochkommas (''%%'%%'') verdoppelt werden, um sie für SQL zu maskieren. Anderenfalls können sie nicht in die Datenbank eingetragen werden.
 +
 +Zum Beispiel muß der Dateiname ''%%Best's of Cap.mp4%%'' in ''%%Best''s of Cap.mp4%%'' umgewandelt werden.
 +
 +ein weiteres Beispiel:
 +  > echo "SELECT dateigröße_in_mib FROM video WHERE pfad=:VERZEICHNIS AND dateiname=:DATEINAME;" | psql -U mmroot -td mm_oeffentlich -v VERZEICHNIS="'/zpool/Video/Test/Test''s 1'" -v DATEINAME="'Best''s of \"Cap\".mp4'"
  
  
/home/http/wiki/data/attic/datenbank/postgresql_12.1651624050.txt · Zuletzt geändert: von manfred