API1:2023 - Broken Object Level Authorization چیست

ويرايش شده ژوئیه 2023 در آموزش ها

API1:2023 - Broken Object Level Authorization


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


مثال:

درخواست GET برای دریافت جزئیات یک محصول با شناسه محصول:


GET /api/products/{product_id}



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

// Non-compliant code

public class UserController : ApiController

{

    [HttpGet]

    public User GetUser(int userId)

    {

        User user = UserRepository.GetUserById(userId);

        return user;

    }



    [HttpPut]

    public IHttpActionResult UpdateUser(User user)

    {

        UserRepository.UpdateUser(user);

        return Ok();

    }

}



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


// Compliant code

public class UserController : ApiController

{

    [HttpGet]

    [Authorize(Roles = "Admin")]

    public User GetUser(int userId)

    {

        User user = UserRepository.GetUserById(userId);

        return user;

    }



    [HttpPut]

    [Authorize(Roles = "Admin")]

    public IHttpActionResult UpdateUser(User user)

    {

        UserRepository.UpdateUser(user);

        return Ok();

    }

}



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


// Non-compliant code

@RestController

public class UserController {

    

    @GetMapping("/users/{userId}")

    public User getUser(@PathVariable int userId) {

        User user = UserRepository.getUserById(userId);

        return user;

    }

    

    @PutMapping("/users/{userId}")

    public ResponseEntity<?> updateUser(@PathVariable int userId, @RequestBody User user) {

        UserRepository.updateUser(user);

        return ResponseEntity.ok().build();

    }

}



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


// Compliant code

public class UserController : ApiController

{

    [HttpGet]

    [Authorize(Roles = "Admin")]

    public User GetUser(int userId)

    {

        User user = UserRepository.GetUserById(userId);

        return user;

    }



    [HttpPut]

    [Authorize(Roles = "Admin")]

    public IHttpActionResult UpdateUser(User user)

    {

        UserRepository.UpdateUser(user);

        return Ok();

    }

}


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


در هر تابع که با استفاده از شناسه کاربر به منبع داده دسترسی می‌یابد، بررسی‌های لازم را برای مجوز دسترسی به سطح اشیا در نظر بگیرید. اطمینان حاصل کنید که کاربر مجاز به دسترسی به این منبع است.

از تأیید صحت شناسه‌ها و مجوزها در هر درخواست استفاده کنید. مطمئن شوید که کاربری که اقدام به دسترسی به یک شیء خاص می‌کند، مجاز به انجام این عمل است.

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

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