Fixes bugs in login ratelimiting
							parent
							
								
									8d64bf7c6e
								
							
						
					
					
						commit
						1c2c1a76fa
					
				| 
						 | 
					@ -115,7 +115,7 @@ class RateLimiter {
 | 
				
			||||||
     * Get number of recent login attempts for an IP
 | 
					     * Get number of recent login attempts for an IP
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    public function getRecentAttempts($ip) {
 | 
					    public function getRecentAttempts($ip) {
 | 
				
			||||||
        $stmt = $this->db->prepare("SELECT COUNT(*) as attempts FROM {$this->authRatelimitTable} 
 | 
					        $stmt = $this->db->prepare("SELECT COUNT(*) as attempts FROM {$this->authRatelimitTable}
 | 
				
			||||||
            WHERE ip_address = ? AND attempted_at > datetime('now', '-' || :minutes || ' minutes')");
 | 
					            WHERE ip_address = ? AND attempted_at > datetime('now', '-' || :minutes || ' minutes')");
 | 
				
			||||||
        $stmt->execute([$ip, $this->decayMinutes]);
 | 
					        $stmt->execute([$ip, $this->decayMinutes]);
 | 
				
			||||||
        $result = $stmt->fetch(PDO::FETCH_ASSOC);
 | 
					        $result = $stmt->fetch(PDO::FETCH_ASSOC);
 | 
				
			||||||
| 
						 | 
					@ -574,7 +574,7 @@ class RateLimiter {
 | 
				
			||||||
     * Clean old page requests
 | 
					     * Clean old page requests
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    private function cleanOldPageRequests() {
 | 
					    private function cleanOldPageRequests() {
 | 
				
			||||||
        $sql = "DELETE FROM {$this->pagesRatelimitTable} 
 | 
					        $sql = "DELETE FROM {$this->pagesRatelimitTable}
 | 
				
			||||||
                WHERE request_time < DATETIME('now', '-1 minute')";
 | 
					                WHERE request_time < DATETIME('now', '-1 minute')";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        $stmt = $this->db->prepare($sql);
 | 
					        $stmt = $this->db->prepare($sql);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -104,9 +104,6 @@ class User {
 | 
				
			||||||
        require_once __DIR__ . '/../helpers/logs.php';
 | 
					        require_once __DIR__ . '/../helpers/logs.php';
 | 
				
			||||||
        $ipAddress = getUserIP();
 | 
					        $ipAddress = getUserIP();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // Record attempt
 | 
					 | 
				
			||||||
        $this->rateLimiter->attempt($username, $ipAddress);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        // Check rate limiting first
 | 
					        // Check rate limiting first
 | 
				
			||||||
        if (!$this->rateLimiter->isAllowed($username, $ipAddress)) {
 | 
					        if (!$this->rateLimiter->isAllowed($username, $ipAddress)) {
 | 
				
			||||||
            $remainingTime = $this->rateLimiter->getDecayMinutes();
 | 
					            $remainingTime = $this->rateLimiter->getDecayMinutes();
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -224,9 +224,6 @@ try {
 | 
				
			||||||
                if ($rateLimiter->tooManyAttempts($username, $user_IP)) {
 | 
					                if ($rateLimiter->tooManyAttempts($username, $user_IP)) {
 | 
				
			||||||
                    throw new Exception(Feedback::get('LOGIN', 'TOO_MANY_ATTEMPTS')['message']);
 | 
					                    throw new Exception(Feedback::get('LOGIN', 'TOO_MANY_ATTEMPTS')['message']);
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					 | 
				
			||||||
                // Record this attempt before trying to login
 | 
					 | 
				
			||||||
                $rateLimiter->attempt($username, $user_IP, false);
 | 
					 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            // Attempt login
 | 
					            // Attempt login
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue