Neden yöntem düzeyinde güvenliğe ihtiyacımız var?


14

Gerçek dünyada, yöntem düzeyinde güvenliği neden uygulamalıyız?

Kullanıcının kullanıcı arayüzüne eriştiği (ve dolayısıyla yönteme doğrudan erişemediği) bir web uygulamamız veya bir masaüstü uygulamamız var.

Peki burada doğrudan erişim yöntemleri nerede ortaya çıkıyor?

edit: Bu soruyu soruyorum çünkü bahar güvenliğini deniyorum ve kullanıcılara yöntemlere erişme yetkisi veriyorum.

gibi bir şey :

 @ROLE_ADMIN
public void update() {
      //update
}

1. güvenlik sorunları hakkında düşünmeden kodu yeniden kullanmak için 2. kolayca bir web hizmeti ile entegre etmek için 3. üst katmanların güvenlik mekanizmalarına güvenmiyorsanız güvenlik hakkında emin olmak için
Erkan Erol

Yanıtlar:


23

Düzgün tasarlanmış bir uygulamada arka uç ve ön uç bağlantısı kesilir. Arka uç güvenlik sistemi, belirli bir ön ucun güvenliği doğru şekilde ele alacağını varsayamaz, bu yüzden onu kendisi ele almalıdır.


Şu soruya cevap vermediniz: neden yöntem seviyesi?
Codism

@Codism - Cevap verdi. B / c hiçbir şey kabul edemez. Yetkilendirme kontrolünü, birisinin oraya nasıl geldiğine bakılmaksızın yöntem düzeyinde b / c yaparsınız, uygun haklara sahip olduğundan emin olmanız gerekir.
Joseph Lust

@JosephLust: Cevap ve yorumunuz herhangi bir güvenlik sistemine herhangi bir düzeyde uygulanabilir. Orijinal soru özellikle neden yöntem düzeyinde sormaktı.
Codism

1
Çünkü mevcut en düşük seviyedir ve AOP veya AspectJ kullanılarak kolayca uygulanabilir. Bunun diğer tüm güvenlik uygulamaları için geçerli olduğuna inanmıyorum.
Joseph Lust

5

Bir denetleyicideki eylemlere rol tabanlı erişimden bahsettiğinizi varsayıyorum. Yani bir MVC mimarisinde bir Controllersınıftaki her yöntem ayrı bir eylemdir. Kullandığım çoğu MVC çerçevesi hem yöntem düzeyinde hem de sınıf düzeyinde ayrıcalıklar atamamı sağlıyor. Bu, sınıf düzeyinde bir öznitelik / ek açıklama uygulayabileceğim anlamına gelir ve ilgili denetleyicideki her eylem için karşılık gelen rol gerekir.

Rol tabanlı erişim için daha ince taneli denetim açısından şunları göz önünde bulundurun:

  • Bir kaynak çevresindeki tüm eylemleri birlikte gruplandırmak uygundur. Yani makaleler, hesaplar vb. İçin Oluştur / Oku / Güncelle / Sil (CRUD) eylemleriniz REST stili API'lerin yazılmasını ve bakımını kolaylaştırır.
  • Birçok sistem, Oluştur / Güncelle / Sil eylemleri için Okuma eylemleri için gerekenden farklı kimlik bilgilerine / rollere sahiptir.
  • Tüm kullanıcı hesabı eylemleri tek bir denetleyicideyse, herkesin oturum açmasına izin vermek istersiniz, ancak yalnızca belirli kişilerin yeni hesap oluşturmasına veya rol atamasına izin verirsiniz.

Beğen ya da sevme, Ruby on Rails birkaç yıl önce hava dalgalarına çarptığında, hemen hemen her MVC çerçevesi temel tasarım yaklaşımını kopyaladı. Eskiden eylemler ayrı sınıflardı, ancak eylem mantığı küçük ve odaklanmış olma eğilimindedir, bu yüzden tam bir sınıf yükü aşırıya kaçar. Bir denetleyicideki yöntemi bir sayfanın eylemiyle eşleştirmek aslında çok mantıklıydı. Birçok kişinin hangi rollerin hangi işlevleri yerine getirebileceği üzerinde hassas bir kontrole ihtiyacı olduğunu bilin.


3

Yöntem düzeyinde güvenlik iki ana nedenden dolayı yararlıdır:

  • başka bir güvenlik katmanı olarak (diğer katmanlara ek olarak)

  • yöntem düzeyinde izinlere sahip olmanın daha uygun veya mantıklı olduğu durumlarda, farklı kullanıcıların aynı "doğrudan" eylemleri gerçekleştirebileceği bir durumu göz önünde bulundurun (böylece istemci güvenliği önemli değildir). ancak bazı durumlarda eylemleri sınırlamak istediğiniz bir davranışı tetikleyebilir - bu durumda yöntem düzeyinde güvenlik ilgili bir çözüm olabilir.


0

Mike Wiesner, bu SpringSource sunumunda, Spring Security 3 / 3.1'e Giriş'te , Tomcat'in ve diğer birçok Servlet kapsayıcısının, unicode kodlandığında, "../" kodunu düzgün bir şekilde tanıyamayan bir hataya sahip olduğunu hatırlattı. Basit bir eşitlik testi Java'da başarısız olur, ancak dosya sistemindeki üst dizine çevrilir.

Güvenlik zordur, birden fazla güvenlik seviyesi, atlatma girişimlerini engelleme şansını artıracaktır. Yöntem düzeyinde güvenlik doğrudan sınıf içinde kodlandığından, AOP artırımından sonra, yöntemi çağırdığınızda, daha önce her zaman güvenlik denetimini çağırırsınız.


-2

Burada kamusal, özel ve korunan yöntemlerden bahsettiğinizi sanıyorum?

Eğer öyleyse, güvenlik amacıyla mevcut değillerdir. Yazılımın düzgün bir şekilde modüle edildiğini garanti etmek için kolaylaştırmak amacıyla mevcutturlar. (Bu konuda başarılı olup olmadıkları, başkaları için bırakacağım bir tartışmadır. Ancak, ne için olduklarının vizyonudur.)

Bir kitaplık teslim ettiğimi varsayalım, daha sonra kitaplığın farklı bir sürümünü teslim etmek ve istediğim kadar özel olarak işaretlenmiş öğeleri değiştirmekte özgürüm. Bunun aksine, bu şeyleri özel olarak işaretlememiş olsaydım, yazılımımın herhangi bir iç kısmını değiştiremezdim, çünkü birisi bir yerlerde doğrudan ona erişiyordu. Elbette, teorik olarak belgelenmiş API'yi kullanmamak onların hatasıdır. Ancak istemci, yazılım güncellememin yazılımlarını kırdığını benim hatam olarak algılayacak. Mazeret istemiyorlar, düzeltilmesini istiyorlar. Ancak, başlangıçlarına erişmelerine izin vermezsem, API'm tam olarak API'm olmayı amaçladığım genel yöntemlerdir ve sorun önlenir.

Bahsetebileceğiniz en olası ikinci şey Java'nın güvenlik modelidir. Bunun hakkında konuşuyorsanız, var olmasının nedeni, Java için orijinal vizyonun, üçüncü taraf programların (örn. Tarayıcılar) etkileşimli olarak çalışması için muhtemelen güvenilmeyen uygulamalar gönderen kişileri içermesidir. Bu nedenle güvenlik modeli, kullanıcılara kötü amaçlı uygulamalara karşı biraz koruma sağlamak amacıyla hazırlanmıştır. Bu nedenle, endişelenecek ve korunacak güvenlik tehdidi, yüklenebilecek diğer yazılımlarla etkileşime girmeye çalışan güvenilmeyen uygulamalardır.


2
anlayamadınız, kamu, özel ve korumalı hakkında değil, bir kullanıcının AOP ile bir rolü olup olmadığını kontrol etme hakkında
stivlo
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.