This is an automated email from the ASF dual-hosted git repository.

lahirujayathilake pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/airavata-portals.git


The following commit(s) were added to refs/heads/main by this push:
     new c61e1eee2 fix password reset vulnerability
c61e1eee2 is described below

commit c61e1eee2e330af36ecd33cc578538cbc5d4d980
Author: lahiruj <[email protected]>
AuthorDate: Thu Oct 16 13:42:57 2025 -0400

    fix password reset vulnerability
---
 airavata-php-gateway/app/libraries/EmailUtilities.php | 12 ++++++------
 airavata-php-gateway/routes/web.php                   | 12 ++++++------
 2 files changed, 12 insertions(+), 12 deletions(-)

diff --git a/airavata-php-gateway/app/libraries/EmailUtilities.php 
b/airavata-php-gateway/app/libraries/EmailUtilities.php
index 49d705813..5cc59b543 100644
--- a/airavata-php-gateway/app/libraries/EmailUtilities.php
+++ b/airavata-php-gateway/app/libraries/EmailUtilities.php
@@ -7,7 +7,7 @@ class EmailUtilities
     public static function sendVerifyEmailAccount($username, $firstName, 
$lastName, $email){
         $portalConfig = Config::get('pga_config.portal');
         $validTime = isset($portalConfig['mail-verify-code-valid-time']) ? 
$portalConfig['mail-verify-code-valid-time'] : 30;
-        $code = uniqid();
+        $code = bin2hex(random_bytes(32));
         Cache::put('PGA-VERIFY-EMAIL-' . $username, $code, $validTime);
 
         $emailTemplates = json_decode(File::get(app_path() . 
'/config/email_templates.json'));
@@ -36,7 +36,7 @@ class EmailUtilities
         if(Cache::has('PGA-VERIFY-EMAIL-' . $username)){
             $storedCode = Cache::get('PGA-VERIFY-EMAIL-' . $username);
             Cache::forget('PGA-VERIFY-EMAIL-' . $username);
-            return $storedCode == $code;
+            return hash_equals($storedCode, $code);
         }else{
             return false;
         }
@@ -45,7 +45,7 @@ class EmailUtilities
     public static function sendVerifyUpdatedEmailAccount($username, 
$firstName, $lastName, $email){
         $portalConfig = Config::get('pga_config.portal');
         $validTime = isset($portalConfig['mail-verify-code-valid-time']) ? 
$portalConfig['mail-verify-code-valid-time'] : 30;
-        $code = uniqid();
+        $code = bin2hex(random_bytes(32));
         Cache::put('PGA-VERIFY-UPDATED-EMAIL-' . $username, $code, $validTime);
 
         $emailTemplates = json_decode(File::get(app_path() . 
'/config/email_templates.json'));
@@ -74,7 +74,7 @@ class EmailUtilities
         if(Cache::has('PGA-VERIFY-UPDATED-EMAIL-' . $username)){
             $storedCode = Cache::get('PGA-VERIFY-UPDATED-EMAIL-' . $username);
             Cache::forget('PGA-VERIFY-UPDATED-EMAIL-' . $username);
-            return $storedCode == $code;
+            return hash_equals($storedCode, $code);
         }else{
             return false;
         }
@@ -84,7 +84,7 @@ class EmailUtilities
     public static function sendPasswordResetEmail($username, $firstName, 
$lastName, $email){
         $portalConfig = Config::get('pga_config.portal');
         $validTime = isset($portalConfig['mail-verify-code-valid-time']) ? 
$portalConfig['mail-verify-code-valid-time'] : 30;
-        $code = uniqid();
+        $code = bin2hex(random_bytes(32));
         Cache::put('PGA-RESET-PASSWORD-' . $username, $code, $validTime);
 
         $emailTemplates = json_decode(File::get(app_path() . 
'/config/email_templates.json'));
@@ -113,7 +113,7 @@ class EmailUtilities
         if(Cache::has('PGA-RESET-PASSWORD-' . $username)){
             $storedCode = Cache::get('PGA-RESET-PASSWORD-' . $username);
             Cache::forget('PGA-RESET-PASSWORD-' . $username);
-            return $storedCode == $code;
+            return hash_equals($storedCode, $code);
         }else{
             return false;
         }
diff --git a/airavata-php-gateway/routes/web.php 
b/airavata-php-gateway/routes/web.php
index 6a8dad48b..e58bd3c7b 100644
--- a/airavata-php-gateway/routes/web.php
+++ b/airavata-php-gateway/routes/web.php
@@ -30,11 +30,11 @@ Route::get('callback-url', [AccountController::class, 
'oauthCallback']);
 Route::get('logout', [AccountController::class, 'logout']);
 Route::post('api-login', [AccountController::class, 'apiLoginSubmit']);
 Route::get('forgot-password', [AccountController::class, 'forgotPassword']);
-Route::get('reset-password', [AccountController::class, 'resetPassword']);
-Route::post('reset-password', [AccountController::class, 
'resetPasswordSubmit']);
-Route::post('forgot-password', [AccountController::class, 
'forgotPasswordSubmit']);
-Route::get('confirm-user-registration', [AccountController::class, 
'confirmAccountCreation']);
-Route::post('confirm-user-registration', [AccountController::class, 
'confirmAccountCreation']);
+Route::get('reset-password', [AccountController::class, 
'resetPassword'])->middleware('throttle:5,10');
+Route::post('reset-password', [AccountController::class, 
'resetPasswordSubmit'])->middleware('throttle:5,10');
+Route::post('forgot-password', [AccountController::class, 
'forgotPasswordSubmit'])->middleware('throttle:3,10');
+Route::get('confirm-user-registration', [AccountController::class, 
'confirmAccountCreation'])->middleware('throttle:10,10');
+Route::post('confirm-user-registration', [AccountController::class, 
'confirmAccountCreation'])->middleware('throttle:10,10');
 Route::get('setUserTimezone', function () {
     Session::put('user_timezone', request('timezone'));
 });
@@ -57,7 +57,7 @@ Route::get('account/user-profile', 
[UserSettingsController::class, 'getUserProfi
 Route::post('account/user-profile', [UserSettingsController::class, 
'updateUserProfile']);
 Route::get('account/user-profile-update-email', 
[UserSettingsController::class, 'showUpdateEmailView']);
 Route::post('account/user-profile-update-email', 
[UserSettingsController::class, 'submitUpdateEmail']);
-Route::get('user-profile-confirm-email', [UserSettingsController::class, 
'confirmUpdateEmail']);
+Route::get('user-profile-confirm-email', [UserSettingsController::class, 
'confirmUpdateEmail'])->middleware('throttle:10,10');
 Route::get('project/create', [ProjectController::class, 'createView']);
 Route::post('project/create', [ProjectController::class, 'createSubmit']);
 Route::get('project/summary', [ProjectController::class, 'summary']);

Reply via email to