Page 1 of 1

Doppelte Accounts

Posted: Wed 5. Feb 2020, 10:20
by alex9849
Hallo,

wenn man über die API von KeyHelp Accounts anlegen möchte, kann es passieren, dass diese doppelt und dreifach im Webinterface angelegt werden. Wenn man den Link zum Anlegen des Accounts (die API) nur schnell genug mehrfach ausführt, merkt KeyHelp nicht, dass der 2. und 3. Versuch einen Account anlegt, der eigentlich schon existiert. Mir ist es jetzt schon 2 mal passiert, dass sich Leute im Webinterface registriert haben und scheinbar der Link zum registrieren mehrfach aufgerufen wurde, was zu mehreren Accounts geführt hat. Hier mal das Log meiner Registrieranwendung:

Code: Select all

2020-02-04 15:17:12	*.*.*.*	200	POST	/index.php?token=8fAcYMChDAYat83OOy4kbK0kReBSSs HTTP/2.0
2020-02-04 15:17:04	*.*.*.*	200 	POST	/index.php?token=8fAcYMChDAYat83OOy4kbK0kReBSSs HTTP/2.0
2020-02-04 15:17:04	*.*.*.*	200 	POST	/index.php?token=8fAcYMChDAYat83OOy4kbK0kReBSSs HTTP/2.0
2020-02-04 15:17:04	*.*.*.*	200 	POST	/index.php?token=8fAcYMChDAYat83OOy4kbK0kReBSSs HTTP/2.0
2020-02-04 15:17:04	*.*.*.*	200 	POST	/index.php?token=8fAcYMChDAYat83OOy4kbK0kReBSSs HTTP/2.0
2020-02-04 15:17:04	*.*.*.*	200 	POST	/index.php?token=8fAcYMChDAYat83OOy4kbK0kReBSSs HTTP/2.0 
Man sieht einmal wurde der Link 5 mal in nur einer Sekunde aufgerufen.

MfG

-alex9849

Re: Doppelte Accounts

Posted: Wed 5. Feb 2020, 12:54
by Tobi
Das liegt daran, dass die Zielseite deines Formular erst geladen wird nachdem der API-Job abgearbeitet wurde.
Dabei kann unter Umständen eine kleine Wartezeit entstehen, so dass sich der User genötigt fühlt mehrmals zu klicken.

Lösung 1:
Nach dem ersten Klick setzt du die CSS Eigenschaft "display" des Buttons auf "none". Dann kann man kein zweites Mal klicken.

Lösung 2 (Besser):
Bevor du den API Call ausführst, einfach mal prüfen ob für den speziellen Token bereits ein API Call gemacht wurde.

Das ist aber insgesamt ein Fehler in deiner Anwendung und nicht in der KeyHelp-Api.
😉

Re: Doppelte Accounts

Posted: Wed 5. Feb 2020, 13:30
by alex9849
Tobi wrote: Wed 5. Feb 2020, 12:54 Das liegt daran, dass die Zielseite deines Formular erst geladen wird nachdem der API-Job abgearbeitet wurde.
Dabei kann unter Umständen eine kleine Wartezeit entstehen, so dass sich der User genötigt fühlt mehrmals zu klicken.

Lösung 1:
Nach dem ersten Klick setzt du die CSS Eigenschaft "display" des Buttons auf "none". Dann kann man kein zweites Mal klicken.

Lösung 2 (Besser):
Bevor du den API Call ausführst, einfach mal prüfen ob für den speziellen Token bereits ein API Call gemacht wurde.

Das ist aber insgesamt ein Fehler in deiner Anwendung und nicht in der KeyHelp-Api.
😉
Doch eigentlich ist das schon ein Fehler von KeyHelp. Zugegeben man könnte das Problem mit deiner Lösung lösen und das werde ich auch probieren, aber es sollte trotzdem nicht möglich sein mit Hilfe der API einen illegalen Zustand der Datenbank zu erzeugen (der doppelte Account). Die ganze Geschichte könnte man mit einem unique constraint auf der entsprechenden Spalte in der DB lösen. Zusammen mit SQL Transactions kann man dann verhinden, dass selbst wenn 2 Accounts paralell angelegt werden am Ende nur einer in der DB steht, da die andere Transaction dann fehlschlägt. Siehe hier: https://de.wikipedia.org/wiki/Isolation_(Datenbank)

Nehmen wir mal an wir hätten 2 Anwendungen die beide über die API auf KeyHelp zugreifen. Wenn die beiden jetzt zufällig beide etwas machen, was so einen illigalen Zuständ erzeugen würde, dann hätten wir wieder das Problem. Selbst wenn die Anwendungen sich selbst darauf prüfen keine Anfragen doppelt raus zu schicken.

Re: Doppelte Accounts

Posted: Wed 5. Feb 2020, 15:30
by Tobi
Die doppelt angelegten User haben in der Datenbank lediglich denselben Namen.
Die User ID, welche als Schlüssel für sämtliche DB Zuordnungen dient, ist aber unterschiedlich.

Aus meiner Sicht macht die API alles richtig.

Re: Doppelte Accounts

Posted: Wed 5. Feb 2020, 17:04
by alex9849
Tobi wrote: Wed 5. Feb 2020, 15:30 Die doppelt angelegten User haben in der Datenbank lediglich denselben Namen.
Die User ID, welche als Schlüssel für sämtliche DB Zuordnungen dient, ist aber unterschiedlich.

Aus meiner Sicht macht die API alles richtig.
Auf dem Unix-System wird dann aber versucht einen zweiten Nutzer mit dem selben Namen anzulegen, was natürlich nicht geht. Schlimmer noch: Versucht man jetzt einen der beiden Nutzer zu löschen wird der unix Benutzer auch gelöscht und plötzlich hat der 2. Account garkeinen User mehr auf dem unix-System. Wenn dann auch noch ein Apache V-Host des anderen Nutzers existiert, hat dieser keinen Zugriff mehr auf die Logdateien, da der Nutzer und die dazugehörigen Ordner nicht mehr existieren. Wenn das passiert startet nicht mal mehr der Webserver. Das Selbe gilt dann für die Subdomain. Wenn wir automatisch Subdomains nach dem Schema <username>.<domainname>.tld. anlegen, haben wir plötzlich 2 mal die gleiche Domain registriert.

Re: Doppelte Accounts

Posted: Wed 5. Feb 2020, 17:25
by Jolinar
alex9849 wrote: Wed 5. Feb 2020, 17:04 Auf dem Unix-System wird dann aber versucht einen zweiten Nutzer mit dem selben Namen anzulegen, was natürlich nicht geht. Schlimmer noch: Versucht man jetzt einen der beiden Nutzer zu löschen wird der unix Benutzer auch gelöscht und plötzlich hat der 2. Account garkeinen User mehr auf dem unix-System. Wenn dann auch noch ein Apache V-Host des anderen Nutzers existiert, hat dieser keinen Zugriff mehr auf die Logdateien, da der Nutzer und die dazugehörigen Ordner nicht mehr existieren. Wenn das passiert startet nicht mal mehr der Webserver. Das Selbe gilt dann für die Subdomain. Wenn wir automatisch Subdomains nach dem Schema <username>.<domainname>.tld. anlegen, haben wir plötzlich 2 mal die gleiche Domain registriert.
Deine Beschreibung der Effekte klingt folgerichtig und logisch.
Ich vermute mal, sobald Alex diesen Thread gelesen hat, wird er sich die Problematik nochmal genauer anschauen und auch dafür eine saubere Lösung finden. 8-)

Re: Doppelte Accounts

Posted: Wed 5. Feb 2020, 18:12
by Tobi
alex9849 wrote: Wed 5. Feb 2020, 17:04
Tobi wrote: Wed 5. Feb 2020, 15:30 Die doppelt angelegten User haben in der Datenbank lediglich denselben Namen.
Die User ID, welche als Schlüssel für sämtliche DB Zuordnungen dient, ist aber unterschiedlich.

Aus meiner Sicht macht die API alles richtig.
Auf dem Unix-System wird dann aber versucht einen zweiten Nutzer mit dem selben Namen anzulegen, was natürlich nicht geht. Schlimmer noch: Versucht man jetzt einen der beiden Nutzer zu löschen wird der unix Benutzer auch gelöscht und plötzlich hat der 2. Account garkeinen User mehr auf dem unix-System. Wenn dann auch noch ein Apache V-Host des anderen Nutzers existiert, hat dieser keinen Zugriff mehr auf die Logdateien, da der Nutzer und die dazugehörigen Ordner nicht mehr existieren. Wenn das passiert startet nicht mal mehr der Webserver. Das Selbe gilt dann für die Subdomain. Wenn wir automatisch Subdomains nach dem Schema <username>.<domainname>.tld. anlegen, haben wir plötzlich 2 mal die gleiche Domain registriert.
Sorry, auf der Ebene hatte ich mir das nicht durchdacht.
So soll es natürlich nicht sein.

Re: Doppelte Accounts  [GELÖST]

Posted: Thu 6. Feb 2020, 08:04
by Alexander
Danke fürs Melden!

das doppelte Anlegen wird mit der kommenden Version dann sowohl über die API als auch über die die UI nicht mehr möglich sein. Die API wird in so einem Fall mit einem 400 Code antworten.

Und da potentiell das Risiko auch beim Anlegen von Domains bestand, ist das nun dort auch sowohl für API und UI gefixt.