Bazı durumlar vardır, kullanıcının Url'yi veya Url'deki parametreleri değişmesini istemeyiz, bunun sebebi çoğu zaman güvenliktir, bazen de kullanıcının yetkisi olsa dahi bizim istediğimiz sırada ilerlemesini isteriz, örnek vermek gerekirse kullanıcın sadece kendisisi için izin verilen kaynakları görüntülemesini isteriz veya çok aşamalı bir formda form adımlarını sırasıyla geçmesini isteriz.
Örnek için aşağıdaki Url'ye bir bakalım:
https://mydomain.com/forms?formId=1&productId=1&stepId=1
Bu Url'de kullanıcının formId=1&productId=1&stepId=1 kısmındaki rakamları değişerek farklı bir kullanıcıya ait forma girmesini veya istediği gibi adımlar arasında gezmesini istemiyoruz.
bu güvenliği sağlamanın birden çok yöntemi vardır.
Örnek için aşağıdaki Url'ye bir bakalım:
https://mydomain.com/forms?formId=1&productId=1&stepId=1
Bu Url'de kullanıcının formId=1&productId=1&stepId=1 kısmındaki rakamları değişerek farklı bir kullanıcıya ait forma girmesini veya istediği gibi adımlar arasında gezmesini istemiyoruz.
bu güvenliği sağlamanın birden çok yöntemi vardır.
- Yetkilendirme yaparak kullanıcının farklı kullanıcıya ait bir forma girmesini engellemek ve formda şuanki aşamayı veritabanına kaydederek izinsiz aşama değiştirmesini engellemek.
- Query string verilerini url'den kaldırarak formda gizli alanlarda tutmak (güvenli değil)
- Query string verilerini şifreleyerek Coockie'de tutmak.
- Query string verilerini şifreleyerek Url'de tutmak.
- Query string verilerini açık tutup fakat bir checksum ekleyerek değiştirildiğinde doğrulanmamasını sağlamak.
- ... farklı yöntemler aklınıza geliyorsa yorumlarda yazarak katkıda bulunabilirsiniz...
Yukarıdaki yöntemlerin her birinin avantajları ve dezavantajları olabilir. fakat bu makalede Açık url güvenliğinden bahsetmek istediğim için 5. yöntemi nasıl sağlayabileceğimizi yazmaya çalışacağım.
Kısa Açıklaması:
Uygumada bir güvenlik tuzu (security salt) adı verilen bir key'i güvenli bir şekilde tutmalıyız. bu tuzu url'nin sonuna ekleyerek url'nın querystring kısmı artı securtysalt'den oluşan string değerin hash'ini oluşturacağız, (sha, md5 vs.) daha sonra url'nin sonuna bu hash'i checksum olarak ekleyeceğiz, ve böylece güvenli aynı zamanda açık bir url'miz olacaktır, kullanıcı bu url'de herhangi bir rakamı değişmek istediğinde checksum artık eski checksum'a eşit olmayacaktır ve doğrulanmayacaktır, aşağıdaki örnek gibi:
https://mydomain.com/forms?formId=1&productId=1&stepId=1&checksum=BABEEF647E9C372FB7B223044CDC6F4932BDF639
Url'yi bu şekilde ürettikten sonra, bu Url'lere tıklandığında, sunucu tarafında, aynı değerler ile checksum'ı tekrar üretiyoruz ve iki checksum'ı kıyaslıyoruz, bu iki checksum eşit değilse kullanıcının url'de değişiklik yaptığını ortaya çıkar, bu yöntemdeki güvenlik tuzu kullanıcının değiştirdiği url'nin hash'ini kendisinin üretmesine engel oluyor.
Aşağıdaki kodda Url'in checksum'ının nasıl üretildiğini ve url'nin nasıl doğrulandığı görülüyor.
File Upload Validation in PHP
YanıtlaSilPHP Programming Error Types
PHP Connection and File Handling on FTP Server
PHP Sending HTML form data to an Email
Set and Get Cookies in PHP
PHP Getting Document of Remote Address
PHP Logging Errors Into a File
PHP SplFileObject Standard Library