| Beide Seiten der vorigen RevisionVorhergehende ÜberarbeitungNächste Überarbeitung | Vorhergehende Überarbeitung |
| datenbank:postgresql_12 [2022-05-04 17:16:51] – [Beispiel] manfred | datenbank:postgresql_12 [2022-05-29 01:28:41] (aktuell) – [Syntax gegen SQL-Injektion] manfred |
|---|
| > 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'" |
| |
| |