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 back-end'de çalışan bir kod değildir. Zaten bu açıklar client tarafda oluşması muhtemel sorunlardır. Yani kullanıcının gördüğü html sayfasını (client'ı) manipüle etmesidir olay. Backend'e müdahele söz konusu bile olamaz (sunucuna sızmazsa).