Read-Only bir property’nin değerini nasıl değiştiririm ?
// 15 Mayıs 2009 // Delphi, Programlama
Başlıktaki sorunun ne kadar gereksiz olduğunu düşündüğünüzü hisseder gibiyim Kim sadece okuma yapılması için tasarlanmış bir property’nin değerini değiştirmek isteyebilir ki ? Zaten adı üstünde readonly. Ancak kazın ayağı pek de öyle değil. Buyurun okuyalım;
Şimdi size anlatacağım biraz tehlikeli bir duruma sebep olabilir..En azından programların yada tasarladığınız component’lerin sağlıklı çalışması açısından sıkıntılar doğurabilir. Bu açıdan şimdiden dikkatli olmakta fayda olduğu konusunda uyarmak isterim. Diyelim ki bir component tasarladık, component’imizi kullanacak arkadaşlarımız için bazı metodları ve property’leri public yaptık.Ancak değiştirilmesini istemediğimiz çok can alıcı bir özelliği de public kısmında sadece okunabilir yaptık. Ya bu değiştirilebilirse o zaman ne yaparız ? Lafla olmuyor, hemen koda geçelim:
TMyClass = class private fMyString : String; public constructor Create; property ReadOnlyProperty : String read fMyString; end;
Diyelim ki böyle bir sınıfımız var, normalde TMyClass’ın bir instance(örnek)’ ını oluşturduğunuzda ReadOnlyProperty alanına veri giremezsiniz.Ancak pek çok popüler ve modern dilde olduğu gibi Delphi’de de Pointer’lar mevcut ve kötü niyetli bir kişi Pointer’lar vasıtası ile bakın sizin sadece okunması amacı ile tasarladığınız property’i nasıl değiştiriyor.
constructor TMyClass.Create; begin inherited; fMyString := 'Bu alanı sadece okuyabilirsiniz, içerisine değer yazamazsınız’; // Sen öyle san end; var myClass : TMyClass; pMyString : ^String; // Bir String Pointer begin myClass := TMyClass.Create; //myClass.ReadOnlyProperty := ‘Birşeyler’; // Bu satır Derleyiciye yakalanır ve derlenmez. // Bakalım içerisinde ne varmış.. ShowMessage(myClass.ReadOnlyProperty); // Değiştiremiyeceğimizi söylüyor //Ancak bu satır da bir sorun oluşmaz pMyString := Addr(myClass.ReadOnlyProperty); // Sınıfın içerisindeki property’nin gösterdiği değişkenin adresini aldık.! pMyString^ := 'Birşeyler'; // Bakalım şimdi içerisinde ne varmış.. ShowMessage(myClass.ReadOnlyProperty); // Değişmiş end;
Peki şimdi ne olacak, herşey allak bullak oldu yahu..Birileri benim ulaşılmasını istemediğim alanlarımın değerini değiştirebiliyor..Ne anladım ben bu işten diyebilirsiniz..Bunun da bir çaresi var. Read ve Write metodlarına function ve procedure yazmak. O zaman kötü niyetli kişiler sizin nesnenizin çalışma sistemini bozamazlar.Nasıl mı ? Şöyle :
İlk sınıf tanımlamamızın yerine şöyle bir tanımlama yapıyoruz;
TMyClass=class private fMyString : String; function GetValue : String; public constructor Create; property ReadOnlyProperty : String read GetValue; end; constructor TMyClass.Create; begin inherited; fMyString := 'Bu alanı sadece okuyabilirsiniz, içerisine değer yazamazsınız'; end; function TMyClass.GetValue : String; begin Result := fMyString; end;
Tanımlamaları bu şekilde yaptıktan sonra kod örneğimizi tekrar denediğinizde kötü niyetli arkadaşın emellerine ulaşamayacağını görebilirsiniz.
Sevgiler, saygılar..
Gayet başarılı bir döküman.
10 yıllık yazılımcıyım hala birşeyler öğreniyorum
Yazılımın ne olduğunu ilk farketmemin üzerinden 20 sene geçti ancak ben de hâla öğreniyorum değerli arkadaşım. Bu bizim mesleğimizin gereği, sürekli öğrenmek kendimizi de güncel tutmamızda önemli bir etken. Ben şikayetçi değilim
Bu yöntem oyun programcıları için birebirdir
Oyunlar için yapılan memory acces işlemiyle oyun yazılımı içindeki değerleri değiştirebilecek hile tarzı programlar
yazabilirler
bu işlem ile yazılamaz değerler oluşur