Add LostPassword Flood Control
authorjoshuaruesweg <ruesweg@woltlab.com>
Fri, 29 Jan 2021 14:49:26 +0000 (15:49 +0100)
committerjoshuaruesweg <ruesweg@woltlab.com>
Fri, 29 Jan 2021 15:49:21 +0000 (16:49 +0100)
com.woltlab.wcf/objectType.xml
wcfsetup/install/files/lib/form/LostPasswordForm.class.php
wcfsetup/install/lang/de.xml
wcfsetup/install/lang/en.xml

index 59bb5ad52c5a2aab59da787711b5ad9c4a048cd8..b61de04c9da340dd20e3d00f9afbd8d32523e2e1 100644 (file)
                        <definitionname>com.woltlab.wcf.floodControl</definitionname>
                </type>
                <!-- /multi factor -->
+               <type>
+                       <name>com.woltlab.wcf.lostPasswordForm</name>
+                       <definitionname>com.woltlab.wcf.floodControl</definitionname>
+               </type>
                <!-- deprecated -->
                <type>
                        <name>com.woltlab.wcf.page.controller</name>
index 6dc5b3970a1e1d008c1fad5670a0373de53a49bf..92d9de2b06cc7fccb19b8013718111226e09d799 100644 (file)
@@ -11,6 +11,7 @@ use wcf\system\email\mime\RecipientAwareTextMimePart;
 use wcf\system\email\UserMailbox;
 use wcf\system\exception\NamedUserException;
 use wcf\system\exception\UserInputException;
+use wcf\system\flood\FloodControl;
 use wcf\system\request\LinkHandler;
 use wcf\system\WCF;
 use wcf\util\HeaderUtil;
@@ -28,6 +29,8 @@ class LostPasswordForm extends AbstractCaptchaForm
 {
     const AVAILABLE_DURING_OFFLINE_MODE = true;
 
+    private const ALLOWED_RESETS_PER_24H = 5;
+
     /**
      * username
      * @var string
@@ -73,6 +76,14 @@ class LostPasswordForm extends AbstractCaptchaForm
     {
         parent::validate();
 
+        $requests = FloodControl::getInstance()->countContent(
+            'com.woltlab.wcf.lostPasswordForm',
+            new \DateInterval('PT24H')
+        );
+        if ($requests['count'] >= self::ALLOWED_RESETS_PER_24H) {
+            throw new NamedUserException(WCF::getLanguage()->getDynamicVariable('wcf.user.lostPassword.error.flood'));
+        }
+
         if (empty($this->username) && empty($this->email)) {
             throw new UserInputException('username');
         }
@@ -148,6 +159,8 @@ class LostPasswordForm extends AbstractCaptchaForm
 
         $this->saved();
 
+        FloodControl::getInstance()->registerContent('com.woltlab.wcf.lostPasswordForm');
+
         // forward to index page
         HeaderUtil::delayedRedirect(
             LinkHandler::getInstance()->getLink(),
index 22b33d90fd6821090d6d2829dc9e2b40f9d9cffb..21822d748e8a41bb5a4bf5373e953dfa04489f9b 100644 (file)
@@ -4600,6 +4600,7 @@ Dateianhänge:
                <item name="wcf.user.lostPassword.description"><![CDATA[{if LANGUAGE_USE_INFORMAL_VARIANT}Wenn du dein Kennwort vergessen hast, musst du entweder den Benutzernamen oder die E-Mail-Adresse angeben, die du in deinem Profil hinterlegt hast. Du kannst dabei nur eines der beiden Felder ausfüllen. Wenn du beide Daten nicht mehr weißt, wende dich bitte an den Administrator.{else}Wenn Sie Ihr Kennwort vergessen haben, müssen Sie entweder den Benutzernamen oder die E-Mail-Adresse angeben, die Sie in Ihrem Profil hinterlegt haben. Sie können dabei nur eines der beiden Felder ausfüllen. Wenn Sie beide Daten nicht mehr wissen, wenden Sie sich bitte an den Administrator.{/if}]]></item>
                <item name="wcf.user.lostPassword.email.error.notFound"><![CDATA[Es wurde kein Benutzer mit der E-Mail-Adresse: „{$email}“ gefunden.]]></item>
                <item name="wcf.user.lostPassword.error.tooManyRequests"><![CDATA[Das Kennwort für dieses Benutzerkonto wurde in den letzten 24 Stunden bereits einmal angefordert. Aus Sicherheitsgründen kann das Kennwort eines Benutzers nur einmal pro Tag angefordert werden. {if LANGUAGE_USE_INFORMAL_VARIANT}Du kannst{else}Sie können{/if} das Kennwort für dieses Benutzerkonto in {#$hours} Stunde{if $hours != 1}n{/if} erneut anfordern.]]></item>
+               <item name="wcf.user.lostPassword.error.flood"><![CDATA[{if LANGUAGE_USE_INFORMAL_VARIANT}Du hast{else}Sie haben{/if} zu viele neue Kennwörter angefordert. Die Funktion wurde daher aus Sicherheitsgründen temporär deaktiviert. Bitte {if LANGUAGE_USE_INFORMAL_VARIANT}versuche{else}versuchen Sie{/if} es später erneut.]]></item>
                <item name="wcf.user.lostPassword.mail.subject"><![CDATA[Kennwort vergessen auf der Website: {@PAGE_TITLE|language}]]></item>
                <item name="wcf.user.lostPassword.mail.plaintext"><![CDATA[Hallo {@$mailbox->getUser()->username},
 
index 54042797df50ad2e904d855c238c0f9aff82a101..963b8377fef42e9feca2577e32e54d1631cb5bfe 100644 (file)
@@ -4601,6 +4601,7 @@ Attachments:
                <item name="wcf.user.lostPassword.description"><![CDATA[You must provide your username or email address to request a new password. Contact the site’s administrator if you need assistance.]]></item>
                <item name="wcf.user.lostPassword.email.error.notFound"><![CDATA[“{$email}” is not used by any account.]]></item>
                <item name="wcf.user.lostPassword.error.tooManyRequests"><![CDATA[The password has been requested at least once in the past 24 hours. For security reasons you must wait at least {#$hours} hour{if $hours != 1}s{/if} before requesting it again.]]></item>
+               <item name="wcf.user.lostPassword.error.flood"><![CDATA[You have requested too many passwords. The function has therefore been temporarily deactivated for security reasons. Please try again later.]]></item>
                <item name="wcf.user.lostPassword.mail.subject"><![CDATA[Lost Password for Website: {@PAGE_TITLE|language}]]></item>
                <item name="wcf.user.lostPassword.mail.plaintext"><![CDATA[Dear {@$mailbox->getUser()->username},