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-03 23:31:55] – [Beispiel] manfreddatenbank:postgresql_12 [2022-05-29 01:28:41] (aktuell) – [Syntax gegen SQL-Injektion] manfred
Zeile 121: Zeile 121:
   > createuser mmroot   > createuser mmroot
  
-Benutzer anzeigen+Benutzer anzeigen:
   > su - postgres -c 'echo "\dg+" | psql'   > su - postgres -c 'echo "\dg+" | psql'
  
-Datenbank "mm_oeffentlich" anlegen+Datenbank "mm_oeffentlich" anlegen:
   > su - postgres -c 'echo "CREATE DATABASE mm_oeffentlich OWNER = mmroot" | psql'   > su - postgres -c 'echo "CREATE DATABASE mm_oeffentlich OWNER = mmroot" | psql'
 +  CREATE DATABASE
  
 Datenbanken anzeigen Datenbanken anzeigen
   > 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 INT, 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 
 + 
 +Tabellen anzeigen: 
 +  > su - postgres -c "echo \"SELECT tablename FROM pg_tables WHERE schemaname != 'pg_catalog' AND schemaname != 'information_schema';\" | psql -d mm_oeffentlich" 
 +   tablename  
 +  ----------- 
 +   video 
 +  (1 row) 
 + 
 +Tabelleninhalt anzeigen: 
 +  > su - postgres -c "echo \"SELECT * FROM video;\" | psql -d mm_oeffentlich" 
 +   id | inode | quersumme | dateiname  
 +  ----+-------+-----------+----------- 
 +  (0 rows) 
 + 
 +testweise einen Datensatz in die Tabelle eintragen: 
 +  > su - postgres -c "echo \"INSERT INTO video (inode,quersumme,dateiname) VALUES ('1234567','asdfghjkl','Film.mkv');\" | psql -d mm_oeffentlich" 
 +  INSERT 0 1 
 + 
 +Testdatensatz anzeigen: 
 +  > su - postgres -c "echo \"SELECT * FROM video;\" | psql -d mm_oeffentlich" 
 +   id |  inode  | quersumme | dateiname  
 +  ----+---------+-----------+----------- 
 +    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) 
 + 
 +Tabelle "video" löschen: 
 +  > su - postgres -c 'echo "DROP TABLE video;" | psql mm_oeffentlich' 
 +  DROP TABLE 
 + 
 +Tabelle "video" anlegen: 
 +  > su - postgres -c 'echo "CREATE TABLE video (id SERIAL, inode INT, quersumme VARCHAR(1000), dateiname VARCHAR(10000));" | psql mm_oeffentlich' 
 +  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.1651620715.txt · Zuletzt geändert: von manfred