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..

“Read-Only bir property’nin değerini nasıl değiştiririm ?” için 3 Yorum

  1. Gürcan diyor ki:

    Gayet başarılı bir döküman.
    10 yıllık yazılımcıyım hala birşeyler öğreniyorum :)

    • Tuğrul HELVACI diyor ki:

      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 :)

  2. Faraclides diyor ki:

    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

Yorum Yazın