From eb9dfaa6090a479fd59d1196263cdf87d95aded8 Mon Sep 17 00:00:00 2001 From: Marco Lehner Date: Wed, 29 May 2024 22:43:34 +0200 Subject: [PATCH] secure for race conditions --- preis.php | 69 +++++++++++++++++++++++++++++++------------------------ 1 file changed, 39 insertions(+), 30 deletions(-) diff --git a/preis.php b/preis.php index 6420ba2..35fa8ef 100644 --- a/preis.php +++ b/preis.php @@ -15,37 +15,46 @@ $salt = rand(1, 100000); $token = hash('ripemd160', $pwd.$salt); //mailhash which will be used for double vote check -> only hashes stuff before @tu-dresden or @mailbox.tu-dresden to avoid double vote in case of aliases. $mailHash = hash('ripemd160', strtolower(explode("+",explode("@",$empfaenger)[0])[0])); -if(strpos($empfaenger, "@mailbox.tu-dresden.de") != false and !strpos(file_get_contents('../../.hMail.txt'), $mailHash)){ - echo strpos(file_get_contents('../../.hMail.txt'), $mailHash); - //nicht bereits abgesendet (kein hash match) und eine @mailbox addr. - $betreff = 'Formular: Lehrpreise'; -$nachricht = "Hallo.\nHier ist die Umfrage für die Lehrpreis Wahl: https://bildungsportal.sachsen.de/umfragen/limesurvey/index.php/488672?lang=de&authkey=".$token."\nVielen Dank für deine Beteiligung!\n\nHi.\nHere is the Link for the teaching award voting: https://bildungsportal.sachsen.de/umfragen/limesurvey/index.php/488672?lang=de&authkey=".$token."\nThanks alot for your participation!"; -$nachricht = wordwrap($nachricht, 80, "\r\n"); -$header = 'From: fsr@ifsr.de' . "\r\n" . - 'Reply-To: fsr@ifsr.de' . "\r\n" . - 'X-Mailer: PHP/' . phpversion(); +$sem = sem_get(123, 1, 0666, 1); +if (sem_acquire($sem)) { + //critical section to avoid double vote in case of high demands + if(strpos($empfaenger, "mail.") === false and strpos($empfaenger, "@mailbox.tu-dresden.de") != false and !strpos(file_get_contents('../../.hMail.txt'), $mailHash)){ + //nicht bereits abgesendet (kein hash match) und eine @mailbox addr. + $betreff = 'Formular: Lehrpreise'; + $nachricht = "Hallo.\nHier ist die Umfrage für die Lehrpreis Wahl: https://bildungsportal.sachsen.de/umfragen/limesurvey/index.php/146778?newtest=Y&lang=de&authkey=".$token."\nVielen Dank für deine Beteiligung!\n\nHi.\nHere is the Link for the teaching award voting: https://bildungsportal.sachsen.de/umfragen/limesurvey/index.php/146778?newtest=Y&lang=en&authkey=".$token."\nThanks alot for your participation!"; + $nachricht = wordwrap($nachricht, 80, "\r\n"); + $header = 'From: fsr@ifsr.de' . "\r\n" . + 'Reply-To: fsr@ifsr.de' . "\r\n" . + 'X-Mailer: PHP/' . phpversion(); + + //mail senden + mail($empfaenger, $betreff, $nachricht, $header); + //hash speichern + file_put_contents("../../.hMail.txt", $mailHash."\n", FILE_APPEND); + sem_release($sem); + //Erfolgsmeldung + echo "

Success, please check your mail.

Mail erfolgreich versendet."; + -//mail senden -mail($empfaenger, $betreff, $nachricht, $header); -//hash speichern - file_put_contents("../../.hMail.txt", $mailHash."\n", FILE_APPEND); - //Erfolgsmeldung - echo "

Success, please check your mail.

Mail erfolgreich versendet."; -} -else{ - if(strpos($empfaenger, "@tu-dresden.de") != false or strpos($empfaenger, "@ifsr.de") != false){ - echo "

Request/Nachfrage

- Da deine Mail Adresse keine @mailbox Adresse ist, würden wir gerne überprüfen, ob du noch studierst.
- Wenn du mit der Überprüfung einverstanden bist, bestätige das bitte unten.
- Wir werden das mittels der ZiH Datenbank abgleichen und - solltest du Student:in sein, dir den Umfragelink zusenden.
- Auch trotz dieser Überprüfung wird nicht abgespeichert, welches Umfrageergebnis zu welcher E-mail Adresse gehört.

- Since your email address is not an @mailbox address, we would like to check if you are still a student.
- If you agree with the verification, please confirm below.
- We will check this against the ZiH database and - if you are a student - send you the survey link.
Even with this check, we will not save which survey result belongs to which email address.
- Ich stimme der Überprüfung zu./I do agree with the check.
- "; - }else{ - echo "

Falsche Mail Adresse oder bereits abgestimmt

Mail Adress wrong or missing or allready voted.

Bitte gebe deine TU Email Adresse an!
Please enter your University Mail adress!"; } + else{ + if(strpos($empfaenger, "@tu-dresden.de") != false or strpos($empfaenger, "@ifsr.de") != false){ + echo "

Request/Nachfrage

+ Da deine Mail Adresse keine @mailbox Adresse ist, würden wir gerne überprüfen, ob du noch studierst.
+ Wenn du mit der Überprüfung einverstanden bist, bestätige das bitte unten.
+ Wir werden das mittels der ZiH Datenbank abgleichen und - solltest du Student:in sein, dir den Umfragelink zusenden.
+ Auch trotz dieser Überprüfung wird nicht abgespeichert, welches Umfrageergebnis zu welcher E-mail Adresse gehört.

+ Since your email address is not an @mailbox address, we would like to check if you are still a student.
+ If you agree with the verification, please confirm below.
+ We will check this against the ZiH database and - if you are a student - send you the survey link.
Even with this check, we will not save which survey result belongs to which email address.
+ Ich stimme der Überprüfung zu./I do agree with the check.
+ "; + }else{ + echo "

Falsche Mail Adresse oder bereits abgestimmt

Mail Adress wrong or missing or allready voted.

Bitte gebe deine TU Email Adresse an!
Please enter your University Mail adress!"; + } + } +}else{ + //semaphore could not be set. + die("Internal Error. If this happens too often, please write fsr@ifsr.de

Sorry

"); } ?>