eval kullanımında güvenlik üzerine beyin fırtınası
Sorumu kolay anlaşılması için bir senaryo ile anlatayım.
Kendi sunucumda bir metin dosyası oluşturuyorum.
Bu metin dosyasına string halde bir js fonksiyonu yazıyorum:
alert("merhaba dünya");
Sonra React Native ile geliştirdiğim mobil uygulamamdan bu sunucuya istek atıp yukarıdaki string'i okuyorum.
Okuduğum string'i eval()
fonksiyonu yardımıyla çalıştırıyorum.
eval()
tehlikeli bir fonksiyon. Çünkü içine ne yazarsanız onu çalıştırıyor.
Eğer kötü niyetli biri yardımcı bir uygulama ile benim attığım isteği yakalar, manipüle eder ve başka bir js komutu ile değiştirip uygulamama yanıt olarak dönerse (man-in-the-middle saldırısı) uygulamama sızmış olur.
Bundan nasıl korulabileceğim üzerine ChatGPT'yle uzun uzun tartıştım. Sonuç olarak bana, isteklerimi https ile atmamı, böylece başkalarının isteğimi okuyamayacağını ve güvenli bir ssl sertifikası kullanmam gerektiğini söyledi. Ama ısrarla eval()
fonksiyonunun tehlikeli olduğunu da söyledi.
Bu ısrarına yönelik ChatGPT'ye şunu sordum:
Eğer
- isteği attığım sunucuya https ile bağlanıyorsam,
- https sayesinde istek manipülasyonundan kurtulabiliyorsam,
- isteği attığım sunucudaki fonksiyonu bizzat ben yazıyorsam,
biri benim sunucuma sızmadığı sürece benim fonksiyonum güvenlidir ve mobil uygulamamda bu fonksiyonu eval()
ile çalıştırmamda bir sakınca yoktur. Doğru mu anladım?
ChatGPT bana kısaca şöyle yanıt verdi:
Sonuç olarak, kendi yazdığınız fonksiyona güvenmeniz durumunda eval ile çalıştırılan fonksiyonun güvenlik açığı içermemesi olasıdır. Ancak, eval fonksiyonunun genel olarak riskli olduğunu ve alternatif güvenli yaklaşımları dikkate almanız gerektiğini unutmayın.
Şimdi size soruyorum. eval()
fonksiyonunu kullanırsam nasıl bir saldırıya uğrayabilirim?
Eval kullanmaman bütün sitelerde yazar hatta "eval is evil" diye anılır, bunun sebebi çok uzun zaman önce JavaScript, çoğu şeyin yalnızca eval ile yapılabildiği, oldukça zayıf bir dildi. İnsanların halen bunu tercih etmesinin sebebi yenilikleri takip etmeyip eskiye takılı kalmalarıdır.
Web kısmında kullanıcılar "her şeyi" manipüle edebilir. Yani sen kullanıcıya bizzat yazdığın fonksiyonu teslim etmiş üstüne düzenlenebilir halde veriyorsun.
Eğer eval ile projen ilerliyorsa o kurduğun yapıyı tamamen bozman gerekir. Çok rahat bir kullanımı var ama insan o rahatlık konforundan çıkmazsa hiçbir şeyi kendisine katamaz