FastCGI: Sicherheits- und Funktionsdiskussion
- 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
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 
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
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
- 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
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:
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.
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 msWas 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
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
- 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
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?
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
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
- 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
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.
- 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
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.NicTheQuick hat geschrieben:JSON klingt gut, aber ich würde es auf jeden Fall Datei-basiert machen mit dem Sessionkey als Dateiname.
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
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
- 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
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:
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
- 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
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
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
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
- 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
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.
- 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
Das war mal wieder viel zu logischNicTheQuick 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.
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
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
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
- 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
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.
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
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