[Owasp-turkey] Arızayı Bul #6

Bedirhan Urgun bedirhanurgun at gmail.com
Sat Dec 5 11:05:19 EST 2009


evet soru biraz genel oldu. daha fazla aciklama yapmam gerekiyordu, hata
benim.

bu bir j2ee web uygulamasi ve *session*, HttpSession implementasyonunun
instance'i. Yani klasik

*public void doPost (HttpServletRequest req, HttpServletResponse res) throws
ServletException, IOException
{
   HttpSession session = req.getSession(true);*
   ...
*   synchronized (session) {
      // ... CS
   }*
  ...

developer boyle bir kod ile critical section'i senkronize etmeye
calisiyor. Web uygulamalarinda HTTP istekleri thread'ler ile karsilaniyor
genel olarak (ASP.NET ve PHP'de de ayni, yanlissam duzeltin). Ayni kullanici
ayni anda iki istek gonderdiginde, yukaridaki kodu calistiran iki thread
olusturuluyor sunucu tarafinda. Ve bu iki thread'in yukaridaki critical
section'a tek tek girmesi ve cikmasi isteniyor (mesela bir havale/eft islemi
veya bilet alimi...).

Senkronizasyonun saglanmasi icin degismeyen bir nesne lazim bize. Developer,
hakli olarak, kullanicinin *session *nesnesini kullaniyor cunku bu nesne
istekler boyunca degismez. session'in mantigi bu.

Ama gelin gorun ki, getSession() metodu iki ayri cagirista ayni session
instance'ini donmeyebiliyormus. Yani icindeki bilgiler (kullanici ismi,
profili, en onemlisi session id, v.b.) ayni ama instance farkli. Servlet
specification'i boyle buyuruyormus. Ayni nesne donmeyince de, ayni nesne
uzerine lock/unlock islemi yapilmayinca senkronizasyon calismiyor. Bu
nedenle senkronizasyonu saglamak icin baska birsey lazim. O da

*synchronized ( session.getId().intern() ) {
 // CS
}*

iste burasi derin geldi bana. getId() metodu istekler boyunca degismeyen
bildigimiz sessionid (mesela, JSESSIONID=ab34126506708923j2). Bu bir Java
string. Peki Java String sinifinin intern() metodu ne yapiyor?

http://java.sun.com/j2se/1.5.0/docs/api/java/lang/String.html#intern()

*A pool of strings, initially empty, is maintained privately by the class
String. *

*When the intern method is invoked, if the pool already contains a string
equal to this String object as determined by the
**equals(Object)*<http://java.sun.com/j2se/1.5.0/docs/api/java/lang/String.html#equals(java.lang.Object)>
* method, then the string from the pool is returned. Otherwise, this
Stringobject is added to the pool and a reference to this
String object is returned.*

Yani *session* ayni instance olmayabilir ama *String* sinifi bir havuz
tutuyormus ve eger bu string (JSESSIONID=...) bu havuzda varsa, yeniden
olusturmayip burdan donuyormus. En azindan benim anladigim bu. Yani ayni
String nesnesi. Boylece synchronized, iki istekte de ayni nesne
kullanildigindan lock/unlock beklendigi gibi calisiyor.

Not: Soruyu gecen sene bir mail listesinde okumustum. Apache-Tomcat mail
listesi olabilir, hatirlamiyorum.

bedirhan
04 Aralık 2009 21:30 tarihinde Mehmet Salih YILDIRIM
<linux at isadamlari.org>yazdı:

> Soru aşırı genel olmakla beraber,
>
> //sample critical section 1
> syncronized (session1){
>     // ...
>     // ..
>     // .
>     syncronized(session2){
>        //...
>     }
> }
> //sample critical section2
> syncronized (session2){
>     // ...
>     // ..
>     // .
>     syncronized(session1){
>        //...
>     }
> }
>
> durumunda kullanılırsa, bir thread CS1 e girip, bir başka thread aynı anda
> CS2'ye girerse, üzerine bunlar hold and wait yaparsa, bunun da üstüne
> işletim sisteminin scheduling management kısmı kalitesizse deadlock olur
> efendim. Muhtemelen aranan cevap bu değil ama soru çok genel olduğundan bu
> kadar yazabildim ancak.
>
> Bu senaryoya göre çözüm bir kaç şekilde olabilir, birincisi thread lerden
> bir tanesini öldürmek :D
> ikincisi nested syncronized kullanmamak olabilir.
> Üçüncü çözüm en güzeli, bu iki critical section'ı aynı lock değişkeni
> koruyabilir. Böylece birisine bir process girdiğinde diğerine başka bir
> process giremeyecektir.
>
>
>
> Bedirhan Urgun wrote:
>
>
> arizalara bi tane daha.
>
> *synchronized (session) {
>  // ...
> }*
>
> yukaridaki Java kod parcasindaki muhtemel problem ne olabilir ve nasil
> duzeltilebilir?
>
> bedirhan
>
> ------------------------------
>
> _______________________________________________
> Owasp-turkey mailing listOwasp-turkey at lists.owasp.orghttps://lists.owasp.org/mailman/listinfo/owasp-turkey
>
>
> _______________________________________________
> Owasp-turkey mailing list
> Owasp-turkey at lists.owasp.org
> https://lists.owasp.org/mailman/listinfo/owasp-turkey
>
>


-- 
Bedirhan Urgun
http://www.webguvenligi.org
http://www.owasp.org/index.php/Turkey

Türkçe Web Uygulama Güvenliği E-Posta Listesine üye olmak için:
https://lists.owasp.org/mailman/listinfo/owasp-turkey
-------------- sonraki bölüm --------------
Bir HTML eklentisi temizlendi...
URL: https://lists.owasp.org/pipermail/owasp-turkey/attachments/20091205/bb0c12fe/attachment.html 


More information about the Owasp-turkey mailing list