API2:2023 - Broken Authentication چیست

در این آسیب پذیری به سبب مکانیزم های ناکافی امنیتی برای احراز هویت کاربر برای دسترسی منابع، امکان اختلال  و دسترسی به اطلاعات محافظت شده توسط مهاجم وجود دارد.


مثال:

درخواست POST برای ورود کاربر با استفاده از اطلاعات ورود:


POST /api/login

Body:

{

  "username": "exampleuser",

  "password": "secretpassword"

}


کد آسیب پذیر(NET.):


// Non-compliant code

[ApiController]

[Route("api/[controller]")]

public class UserController : ControllerBase

{

    [HttpPost]

    public IActionResult Login(string username, string password)

    {

        if (AuthenticateUser(username, password))

        {

            // Generate and return authentication token

            var token = GenerateAuthToken(username);

            return Ok(token);

        }

        else

        {

            return Unauthorized();

        }

    }



    [HttpGet]

    public IActionResult GetUserData(int userId)

    {

        // Retrieve user data from the database

        var userData = Database.GetUserById(userId);



        // Return user data

        return Ok(userData);

    }



    // Other methods...

}


پیشگیری (NET.):


// Compliant code

[ApiController]

[Route("api/[controller]")]

public class UserController : ControllerBase

{

    private readonly IUserService _userService;

    private readonly IAuthenticationService _authenticationService;



    public UserController(IUserService userService, IAuthenticationService authenticationService)

    {

        _userService = userService;

        _authenticationService = authenticationService;

    }



    [HttpPost]

    public IActionResult Login(LoginModel loginModel)

    {

        if (_authenticationService.AuthenticateUser(loginModel.Username, loginModel.Password))

        {

            // Generate and return authentication token

            var token = _authenticationService.GenerateAuthToken(loginModel.Username);

            return Ok(token);

        }

        else

        {

            return Unauthorized();

        }

    }



    [HttpGet]

    [Authorize]

    public IActionResult GetUserData(int userId)

    {

        // Retrieve the authenticated user's identity

        var identity = HttpContext.User.Identity as ClaimsIdentity;

        if (identity != null)

        {

            // Get the user ID from the authentication token

            var userIdFromToken = identity.FindFirst("UserId")?.Value;



            if (!string.IsNullOrEmpty(userIdFromToken) && userIdFromToken == userId.ToString())

            {

                // Retrieve user data from the database

                var userData = _userService.GetUserData(userId);

                return Ok(userData);

            }

        }



        return Unauthorized();

    }



    // Other methods...

}


کد آسیب پذیر (جاوا):


@RestController

@RequestMapping("/api/users")

public class UserController {



    @Autowired

    private UserService userService;



    @PostMapping("/login")

    public ResponseEntity<String> login(@RequestParam String username, @RequestParam String password) {

        if (userService.authenticateUser(username, password)) {

            // Generate and return authentication token

            String token = generateAuthToken(username);

            return ResponseEntity.ok(token);

        } else {

            return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build();

        }

    }



    @GetMapping("/{userId}")

    public ResponseEntity<User> getUserData(@PathVariable int userId) {

        // Retrieve user data from the database

        User user = userService.getUserById(userId);



        // Return user data

        return ResponseEntity.ok(user);

    }



    // Other methods...

}


پیشگیری (جاوا):

@RestController

@RequestMapping("/api/users")

public class UserController {



    @Autowired

    private UserService userService;



    @Autowired

    private AuthenticationService authenticationService;



    @PostMapping("/login")

    public ResponseEntity<String> login(@RequestParam String username, @RequestParam String password) {

        if (authenticationService.authenticateUser(username, password)) {

            // Generate and return authentication token

            String token = authenticationService.generateAuthToken(username);

            return ResponseEntity.ok(token);

        } else {

            return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build();

        }

    }



    @GetMapping("/{userId}")

    public ResponseEntity<User> getUserData(@PathVariable int userId, @RequestHeader("Authorization") String authToken) {

        if (authenticationService.validateAuthToken(authToken)) {

            // Retrieve user data from the database

            User user = userService.getUserById(userId);



            // Return user data

            return ResponseEntity.ok(user);

        } else {

            return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build();

        }

    }



    // Other methods...

}



پیشنهادات کلی جلوگیری:

از مکانیزم‌های احراز هویت قوی و استاندارد استفاده کنید مانند JWT (JSON Web Tokens) یا OAuth.

از روش‌های رمزنگاری قوی برای ذخیره و انتقال اطلاعات حساس مانند رمزنگاری اتصال (TLS/SSL) استفاده کنید.

اطلاعات احراز هویت را به درستی بررسی کنید و تأیید کنید که هر درخواست احراز هویت شده از یک کاربر معتبر است.

به دقت بررسی کنید که اطلاعات احراز هویت (مانند رمز عبور) در انتقال یا ذخیره‌سازی داده‌ها در سرور، به صورت امن و رمزنگاری شده باشند.

استفاده از محدودیت تعداد تلاش‌های ناموفق برای ورود و بسته شدن موقت حساب کاربری پس از تعداد مشخصی از تلاش‌های ناموفق.

برچسب خورده:
جهت ارسال ديدگاه وارد شويد و يا ثبت نام كنيد.