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) استفاده کنید.
اطلاعات احراز هویت را به درستی بررسی کنید و تأیید کنید که هر درخواست احراز هویت شده از یک کاربر معتبر است.
به دقت بررسی کنید که اطلاعات احراز هویت (مانند رمز عبور) در انتقال یا ذخیرهسازی دادهها در سرور، به صورت امن و رمزنگاری شده باشند.
استفاده از محدودیت تعداد تلاشهای ناموفق برای ورود و بسته شدن موقت حساب کاربری پس از تعداد مشخصی از تلاشهای ناموفق.