FastCGI: Sicherheits- und Funktionsdiskussion

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
TroaX
Beiträge: 699
Registriert: 08.03.2013 14:27
Computerausstattung: PC: Ryzen 9 3950X, 96 GB RAM, RX6800XT, 2.5 TB SSD, 21:9 Display, Linux Mint | Lappi: Ryzen 7 5800H, 16 GB RAM, 1 TB SSD, Linux Mint
Wohnort: NRW
Kontaktdaten:

Re: FastCGI: Sicherheits- und Funktionsdiskussion

Beitrag von TroaX »

Kein Plan, ob das geht. Aber die Routine steht ja schon fertig unter dem Link vom Nic. Man muss sie ja nur anpassen. Also ich möchte definitiv keinen PHP Wrapper oder gar Interpreter in meiner FastCGI Anwendung. Ich habe nach dem Release der ersten Beta selbige für FastCGI gefeiert. Da verderbe ich mir doch nicht die Laune, in dem ich mir wieder das aufhalse, was ich endlich losgeworden bin :D
PC: Ryzen 9 3950X | 96 GB RAM | RX6800XT | 2,5 TB NVMe | Linux Mint
Notebook: 16" 3:2 | Ryzen 7 5800H | 16 GB RAM | Radeon Vega | 1TB NVMe | Linux Mint
NAS: N150 Mini-PC | 16 GB RAM | Debian 13+CasaOS
Coding: Purebasic, Spiderbasic, GDevelop, PHP
Blog: https://techtroax.de
Repos: https://codeberg.org/TroaX
Benutzeravatar
TroaX
Beiträge: 699
Registriert: 08.03.2013 14:27
Computerausstattung: PC: Ryzen 9 3950X, 96 GB RAM, RX6800XT, 2.5 TB SSD, 21:9 Display, Linux Mint | Lappi: Ryzen 7 5800H, 16 GB RAM, 1 TB SSD, Linux Mint
Wohnort: NRW
Kontaktdaten:

Re: FastCGI: Sicherheits- und Funktionsdiskussion

Beitrag von TroaX »

Sooo da bin ich mal wieder. Hatte jetzt mal etwas Zeit und habe mir da mal eine Passwort-Lib geschrieben, mit der ich versucht habe, PBKDF2 in PureBasic zu implementieren.
Das Bitweise verschieben habe ich allerdings nicht mit drin. Da muss ich noch sehen, wie ich den String verschiebbar in einen numerischen Wert umwandle. Dafür war ich aus PB zu lange raus *schäm*

Die passenden Ergebnisse auf meinen Rechner (i5-4570 + 8GB RAM) mit SHA3 und 512 Bit:

Code: Alles auswählen

Bench with 10 Peppers
1 Iterations in 0 ms | Comparing is 1 | Comparing in 0 ms
2 Iterations in 0 ms | Comparing is 1 | Comparing in 0 ms
4 Iterations in 1 ms | Comparing is 1 | Comparing in 0 ms
8 Iterations in 0 ms | Comparing is 1 | Comparing in 0 ms
16 Iterations in 0 ms | Comparing is 1 | Comparing in 1 ms
32 Iterations in 0 ms | Comparing is 1 | Comparing in 1 ms
64 Iterations in 0 ms | Comparing is 1 | Comparing in 1 ms
128 Iterations in 0 ms | Comparing is 1 | Comparing in 1 ms
256 Iterations in 1 ms | Comparing is 1 | Comparing in 8 ms
512 Iterations in 1 ms | Comparing is 1 | Comparing in 2 ms
1024 Iterations in 4 ms | Comparing is 1 | Comparing in 3 ms
2048 Iterations in 6 ms | Comparing is 1 | Comparing in 58 ms
4096 Iterations in 13 ms | Comparing is 1 | Comparing in 39 ms
8192 Iterations in 26 ms | Comparing is 1 | Comparing in 259 ms

Bench with 100 Peppers
1 Iterations in 0 ms | Comparing is 1 | Comparing in 0 ms
2 Iterations in 0 ms | Comparing is 1 | Comparing in 1 ms
4 Iterations in 0 ms | Comparing is 1 | Comparing in 1 ms
8 Iterations in 0 ms | Comparing is 1 | Comparing in 3 ms
16 Iterations in 0 ms | Comparing is 1 | Comparing in 4 ms
32 Iterations in 0 ms | Comparing is 1 | Comparing in 5 ms
64 Iterations in 1 ms | Comparing is 1 | Comparing in 14 ms
128 Iterations in 1 ms | Comparing is 1 | Comparing in 10 ms
256 Iterations in 1 ms | Comparing is 1 | Comparing in 39 ms
512 Iterations in 1 ms | Comparing is 1 | Comparing in 37 ms
1024 Iterations in 4 ms | Comparing is 1 | Comparing in 264 ms
2048 Iterations in 6 ms | Comparing is 1 | Comparing in 195 ms
4096 Iterations in 13 ms | Comparing is 1 | Comparing in 52 ms
8192 Iterations in 26 ms | Comparing is 1 | Comparing in 1681 ms

Bench with 1000 Peppers
1 Iterations in 0 ms | Comparing is 1 | Comparing in 5 ms
2 Iterations in 0 ms | Comparing is 1 | Comparing in 7 ms
4 Iterations in 0 ms | Comparing is 1 | Comparing in 15 ms
8 Iterations in 0 ms | Comparing is 1 | Comparing in 21 ms
16 Iterations in 0 ms | Comparing is 1 | Comparing in 18 ms
32 Iterations in 0 ms | Comparing is 1 | Comparing in 42 ms
64 Iterations in 1 ms | Comparing is 1 | Comparing in 106 ms
128 Iterations in 0 ms | Comparing is 1 | Comparing in 324 ms
256 Iterations in 1 ms | Comparing is 1 | Comparing in 559 ms
512 Iterations in 1 ms | Comparing is 1 | Comparing in 1540 ms
1024 Iterations in 3 ms | Comparing is 1 | Comparing in 2162 ms
2048 Iterations in 6 ms | Comparing is 1 | Comparing in 5645 ms
4096 Iterations in 13 ms | Comparing is 1 | Comparing in 8366 ms
8192 Iterations in 27 ms | Comparing is 1 | Comparing in 5135 ms

Bench without Pepperlist (static)
1 Iterations in 0 ms | Comparing is 1 | Comparing in 0 ms
2 Iterations in 0 ms | Comparing is 1 | Comparing in 0 ms
4 Iterations in 0 ms | Comparing is 1 | Comparing in 0 ms
8 Iterations in 0 ms | Comparing is 1 | Comparing in 0 ms
16 Iterations in 1 ms | Comparing is 1 | Comparing in 0 ms
32 Iterations in 0 ms | Comparing is 1 | Comparing in 0 ms
64 Iterations in 0 ms | Comparing is 1 | Comparing in 1 ms
128 Iterations in 0 ms | Comparing is 1 | Comparing in 1 ms
256 Iterations in 0 ms | Comparing is 1 | Comparing in 1 ms
512 Iterations in 2 ms | Comparing is 1 | Comparing in 2 ms
1024 Iterations in 3 ms | Comparing is 1 | Comparing in 3 ms
2048 Iterations in 7 ms | Comparing is 1 | Comparing in 6 ms
4096 Iterations in 14 ms | Comparing is 1 | Comparing in 13 ms
8192 Iterations in 26 ms | Comparing is 1 | Comparing in 26 ms
16384 Iterations in 52 ms | Comparing is 1 | Comparing in 52 ms
32768 Iterations in 103 ms | Comparing is 1 | Comparing in 105 ms
65536 Iterations in 208 ms | Comparing is 1 | Comparing in 207 ms
131072 Iterations in 416 ms | Comparing is 1 | Comparing in 415 ms
262144 Iterations in 829 ms | Comparing is 1 | Comparing in 831 ms
524288 Iterations in 1661 ms | Comparing is 1 | Comparing in 1658 ms

Bench without Pepperlist and Compare
1 Iterations in 0 ms
2 Iterations in 0 ms
4 Iterations in 0 ms
8 Iterations in 0 ms
16 Iterations in 0 ms
32 Iterations in 1 ms
64 Iterations in 0 ms
128 Iterations in 0 ms
256 Iterations in 1 ms
512 Iterations in 2 ms
1024 Iterations in 3 ms
2048 Iterations in 6 ms
4096 Iterations in 13 ms
8192 Iterations in 26 ms
16384 Iterations in 52 ms
32768 Iterations in 104 ms
65536 Iterations in 209 ms
131072 Iterations in 414 ms
262144 Iterations in 829 ms
524288 Iterations in 1658 ms
1048576 Iterations in 3321 ms
2097152 Iterations in 6648 ms
4194304 Iterations in 13289 ms
8388608 Iterations in 26621 ms
16777216 Iterations in 53870 ms

Benchtime: 140508 ms
Hier ist der Code: pwlib.zip

Was mir sehr stark auffällt ist, das es sehr schwer werden wird, ein Optimum an Leistung bei den Iterationen und der Anzahl der Pepper zu finden. Ich habe schon überlegt, mit 1.000 Peppern zu arbeiten, aber nur ab dem hundertsten aufwärts zu vergeben, damit auf jeden Fall eine gewisse Anzahl an Peppern durchgetestet werden muss. Denn stellenweise war es schon krass, das bei 1.000 Iterationen und z.B. 1.000 Peppern das Passwort auch schon in unter 100 ms geprüft werden konnte. Andere Durchläufe brauchen sogar weit über 2 oder 3 Sekunden. Ich peil aber zwischen 500 und 1.000 ms an.
PC: Ryzen 9 3950X | 96 GB RAM | RX6800XT | 2,5 TB NVMe | Linux Mint
Notebook: 16" 3:2 | Ryzen 7 5800H | 16 GB RAM | Radeon Vega | 1TB NVMe | Linux Mint
NAS: N150 Mini-PC | 16 GB RAM | Debian 13+CasaOS
Coding: Purebasic, Spiderbasic, GDevelop, PHP
Blog: https://techtroax.de
Repos: https://codeberg.org/TroaX
Benutzeravatar
TroaX
Beiträge: 699
Registriert: 08.03.2013 14:27
Computerausstattung: PC: Ryzen 9 3950X, 96 GB RAM, RX6800XT, 2.5 TB SSD, 21:9 Display, Linux Mint | Lappi: Ryzen 7 5800H, 16 GB RAM, 1 TB SSD, Linux Mint
Wohnort: NRW
Kontaktdaten:

Re: FastCGI: Sicherheits- und Funktionsdiskussion

Beitrag von TroaX »

Sooo. Da ich nun PBKDF2 für Passwörter für Purebasic durch habe (siehe hier: http://forums.purebasic.com/german/view ... =8&t=29268 ), kommt der nächste Milestone an die Reihe. Sessions!

Ich habe da verschiedenste Ansätze im Kopf. Einer wäre es, das ganze mit JSON und wie bei PHP auch, in Dateien zu machen. Das gleiche hatte ich mir aber über die Preferences überlegt. Ebenfalls möglich wäre eine eigene SQLIte-DB. JSON würde ich als Format bevorzugen, da es im Ansatz ähnlich aufgebaut ist wie das Array-Serialisieren aus PHP, was auch dort für Sessions genutzt wird. Strukturen würde ich da Code-Intern sehr gut eignen.

Hat da vielleicht jemand noch Vorschläge dazu?
PC: Ryzen 9 3950X | 96 GB RAM | RX6800XT | 2,5 TB NVMe | Linux Mint
Notebook: 16" 3:2 | Ryzen 7 5800H | 16 GB RAM | Radeon Vega | 1TB NVMe | Linux Mint
NAS: N150 Mini-PC | 16 GB RAM | Debian 13+CasaOS
Coding: Purebasic, Spiderbasic, GDevelop, PHP
Blog: https://techtroax.de
Repos: https://codeberg.org/TroaX
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8820
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: FastCGI: Sicherheits- und Funktionsdiskussion

Beitrag von NicTheQuick »

JSON klingt gut, aber ich würde es auf jeden Fall Datei-basiert machen mit dem Sessionkey als Dateiname. Ein Memory-Cache ist vermutlich nicht notwendig, weil das das Betriebssystem bei kleinen Dateien normalerweise recht ordentlich löst. Optional würde ich vielleicht noch an eine SQL-Anbindung denken, aber SQLite finde ich unnötig.
Benutzeravatar
TroaX
Beiträge: 699
Registriert: 08.03.2013 14:27
Computerausstattung: PC: Ryzen 9 3950X, 96 GB RAM, RX6800XT, 2.5 TB SSD, 21:9 Display, Linux Mint | Lappi: Ryzen 7 5800H, 16 GB RAM, 1 TB SSD, Linux Mint
Wohnort: NRW
Kontaktdaten:

Re: FastCGI: Sicherheits- und Funktionsdiskussion

Beitrag von TroaX »

NicTheQuick hat geschrieben:JSON klingt gut, aber ich würde es auf jeden Fall Datei-basiert machen mit dem Sessionkey als Dateiname.
Klingt auch für mich am logischsten. Nur stellt sich da die Frage wegen dem Aufbau. In PHP ist eine Session ja im Grunde wie ein Array angelegt. Da kann man natürlich dann auch mehrere Arrays verschachteln. Ist das verschachteln verschiedener Listen denn wichtig, oder kann man darauf verzichten? Ich halte es schon für wichtig, da zum Beispiel damit Warenkörbe umgesetzt werden können.

Die Session-IDs würde ich nach dem Muster md5(datum+uhrzeit+ElapsedMilliseconds+4stelligeZufallszahl) erzeugen, aber noch die Möglichkeit geben, eine eigene zu setzen.
PC: Ryzen 9 3950X | 96 GB RAM | RX6800XT | 2,5 TB NVMe | Linux Mint
Notebook: 16" 3:2 | Ryzen 7 5800H | 16 GB RAM | Radeon Vega | 1TB NVMe | Linux Mint
NAS: N150 Mini-PC | 16 GB RAM | Debian 13+CasaOS
Coding: Purebasic, Spiderbasic, GDevelop, PHP
Blog: https://techtroax.de
Repos: https://codeberg.org/TroaX
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8820
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: FastCGI: Sicherheits- und Funktionsdiskussion

Beitrag von NicTheQuick »

Um bei PHP zu bleiben.
Hier siehst du die Funktion, die diese Session ID generiert: https://github.com/php/php-src/blob/d9bfe06194ae8f760cb43a3e7120d0503f327398/ext/session/session.c#L284
Es wird ein MD5/SHA1 aus den folgenden Werten berechnet:
  • IP-Adresse des Klienten
  • Aktuelle Uhrzeit
  • Zahl aus einem Pseudo-Random-Generator
  • Betriebssystem-spezifischer kryptographisch sicherer Zufallszahlengenerator
Benutzeravatar
TroaX
Beiträge: 699
Registriert: 08.03.2013 14:27
Computerausstattung: PC: Ryzen 9 3950X, 96 GB RAM, RX6800XT, 2.5 TB SSD, 21:9 Display, Linux Mint | Lappi: Ryzen 7 5800H, 16 GB RAM, 1 TB SSD, Linux Mint
Wohnort: NRW
Kontaktdaten:

Re: FastCGI: Sicherheits- und Funktionsdiskussion

Beitrag von TroaX »

Hmmm ... Das mit der IP-Adresse gefällt mir mal überhaupt nicht. Ich versuche nach Möglichkeit, diese Module so unabhängig wie möglich zu gestalten. Wenn jemand die Funktionalität anderweitig einsetzen will, dann klappt das wegen der fehlenden IP nicht mehr. Und das wäre doof.

Ich kann höchstens beim starten von Session einen weiteren Parameter abfragen, über den man sagen kann, ob es für eine CGI/FastCGI ist oder nicht. Mir fällt auf Anhieb nicht ein, wie man die Existenz eines Requests prüfen kann, ohne CGI oder FastCGI zu initialisieren. hmmm schwierig
PC: Ryzen 9 3950X | 96 GB RAM | RX6800XT | 2,5 TB NVMe | Linux Mint
Notebook: 16" 3:2 | Ryzen 7 5800H | 16 GB RAM | Radeon Vega | 1TB NVMe | Linux Mint
NAS: N150 Mini-PC | 16 GB RAM | Debian 13+CasaOS
Coding: Purebasic, Spiderbasic, GDevelop, PHP
Blog: https://techtroax.de
Repos: https://codeberg.org/TroaX
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8820
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: FastCGI: Sicherheits- und Funktionsdiskussion

Beitrag von NicTheQuick »

Mach einen optionalen Parameter, dem man die IP als String mitgibt. Dadurch ist er sogar universell einsetzbar und man kann alle möglichen Dinge neben der IP nutzen. Also auch Hostnames, Programmname, ProzessIDs, usw.
Benutzeravatar
TroaX
Beiträge: 699
Registriert: 08.03.2013 14:27
Computerausstattung: PC: Ryzen 9 3950X, 96 GB RAM, RX6800XT, 2.5 TB SSD, 21:9 Display, Linux Mint | Lappi: Ryzen 7 5800H, 16 GB RAM, 1 TB SSD, Linux Mint
Wohnort: NRW
Kontaktdaten:

Re: FastCGI: Sicherheits- und Funktionsdiskussion

Beitrag von TroaX »

NicTheQuick hat geschrieben:Mach einen optionalen Parameter, dem man die IP als String mitgibt. Dadurch ist er sogar universell einsetzbar und man kann alle möglichen Dinge neben der IP nutzen. Also auch Hostnames, Programmname, ProzessIDs, usw.
Das war mal wieder viel zu logisch :lol:
Jetzt fange ich auch noch an, immer die Programmierer gängeln zu müssen. Mein Gedanke war es, sichergehen zu müssen, das bei einer FastCGI-Anwendung immer die IP verwendet wird. Ich mache den Parameter aber Optional. Dann kann ich mir etwas zum befüllen noch einfallen lassen. So kann dann auch jeder gefahrlos die Session nutzen, auch wenn er keinen Parameter mit anfügt. Man muss ja auch ein bisschen aufpassen zwecks kollision und so :D
PC: Ryzen 9 3950X | 96 GB RAM | RX6800XT | 2,5 TB NVMe | Linux Mint
Notebook: 16" 3:2 | Ryzen 7 5800H | 16 GB RAM | Radeon Vega | 1TB NVMe | Linux Mint
NAS: N150 Mini-PC | 16 GB RAM | Debian 13+CasaOS
Coding: Purebasic, Spiderbasic, GDevelop, PHP
Blog: https://techtroax.de
Repos: https://codeberg.org/TroaX
Benutzeravatar
TroaX
Beiträge: 699
Registriert: 08.03.2013 14:27
Computerausstattung: PC: Ryzen 9 3950X, 96 GB RAM, RX6800XT, 2.5 TB SSD, 21:9 Display, Linux Mint | Lappi: Ryzen 7 5800H, 16 GB RAM, 1 TB SSD, Linux Mint
Wohnort: NRW
Kontaktdaten:

Re: FastCGI: Sicherheits- und Funktionsdiskussion

Beitrag von TroaX »

Soo ich habe jetzt nach Tagen endlich mal mit den Sessions Anfangen können. Aber als Modul stellt sich das übler dar, als ich dachte. Ich habe mich für die Werte dazu entschieden, im Modul eine Map zu pflegen, in der man nach Getter/Setter Prinzip Werte einschreiben kann. Das klappt auch super. Nun habe ich aber das Problem, das wenn ich einen Warenkorb z.B. erstellen will, benötige ich für einen Schlüssel eine zweite Dimension. Und da wird es haarig. Denn man kann einer Map, einer List oder einem Array ja nur einen festen Datentyp zuweisen. Also muss ich einen Weg finden, wie ich das ganze Schrittweise mit JSON erledige. Nur dann habe ich das Problem, das Prozeduren ja nur Strings und Zahlen zurückliefern. Der Code in den Modulen aber ist so privat, das ich von ganz außen keine Listen und Maps definieren kann, mit denen die Prozeduren im Modul arbeiten können. Genauso ist es umgekehrt. Ich kann im Modul keine Listen oder Maps definieren, mit denen ich außen arbeiten kann.

Mein derzeitiger Lösungsansatz: Ich arbeite mit zwei Maps. Einer String-Map und einer List-Map. Diese packe ich in den Declare-Bereich des Moduls und man kann z.B. mit PB_WebSessions::Values("user") und PB_WebSessions::Lists("basket") zugreifen. In letzteres kann man eine List einfügen, während die erste Map nur für alleinstehende Werte ist.

Hat da vielleicht jemand einen eleganteren Vorschlag? Irgendwie gefällt mir das so nicht.
PC: Ryzen 9 3950X | 96 GB RAM | RX6800XT | 2,5 TB NVMe | Linux Mint
Notebook: 16" 3:2 | Ryzen 7 5800H | 16 GB RAM | Radeon Vega | 1TB NVMe | Linux Mint
NAS: N150 Mini-PC | 16 GB RAM | Debian 13+CasaOS
Coding: Purebasic, Spiderbasic, GDevelop, PHP
Blog: https://techtroax.de
Repos: https://codeberg.org/TroaX
Antworten