Merhaba kodlab’ın python ders kitabında tkinter ünitesinde bir hesap makinesi kodlarken eval fonksiyonunu kullanmadan önce bunun tehlikeli bir fonksiyon olduğunu söylüyor. Neden tehlikeli olduğuna dair bir açıklama yapmıyor.
Tehlikeliden kastı nedir? Eval fonksiyonu içerisine gönderilen işlemi yapıp çıktı veriyor öyle değil mi? Bahsedilen ne olabilir?
print("""
Basit bir hesap makinesi uygulaması.
İşleçler:
+ toplama
- çıkarma
* çarpma
/ bölme
Yapmak istediğiniz işlemi yazıp ENTER
tuşuna basın. (Örneğin 23 ve 46 sayılarını
çarpmak için 23 * 46 yazdıktan sonra
ENTER tuşuna basın.)
""")
veri = input("İşleminiz: ")
hesap = eval(veri)
print(hesap)
Burada girilen değerleri kısıtlamazsak çok büyük bir açık olur ve kullanıcı eval fonk kullanarak istediğini yapabilir.
Örnek olarak dosya oluşturabilir veya mevcut dosyaları silerek sisteme zarar verebilir.
Mesela aşağıdaki gibi bir kısıtlama koyabilirsin.
Böylelikle başka bir işlemin yapılmasını engellersiniz.
print("""
Basit bir hesap makinesi uygulaması.
İşleçler:
+ toplama
- çıkarma
* çarpma
/ bölme
Yapmak istediğiniz işlemi yazıp ENTER
tuşuna basın. (Örneğin 23 ve 46 sayılarını
çarpmak için 23 * 46 yazdıktan sonra
ENTER tuşuna basın.)
""")
karset = "1234567890*/+-,. "
veri = input("İşleminiz: ")
for i in veri:
if not i in karset:
print("Neyin peşindesiniz...:(")
quit()
hesap = eval(veri)
print(hesap)
Duzgun kullanilmadiginda Kullanici eval fonksiyonu icine sizin isteminiz disindaki python komutlarini calistira bilir ve bu cok tehlikeli ola bilir.internette arastirmanizi tavsiye ederim.
Satır sayısının birden fazla olduğu bir eval örneği paylaşabilir misiniz? Bildiğim kadarıyla eval birden fazla satırı olan if, while, def gibi deyimleri ve birden fazla satırı çalıştıramıyor, bunun yerine tek satırlık, ifade dediğimiz, değer döndüren şeyi çalıştırıyor.
birden fazla satırlı olduğu doğru ama tek bir ifadenin birden fazla satırlısı değil mi bu? sonuçta satır birden fazla da olsa işlem tek. bence @dildeolupbiten bahsettiği durum satır sayısının sadece miktar olarak değil işlem olarak da fazlalığı.
Birden fazla işlem de yapabiliriz, hem de tek satırda:
>>> eval("print('merhaba') or print('dünya')")
merhaba
dünya
>>>
Gerçi buradaki "işlem"i tam olarak hangi anlamda kullanıyorsunuz bilmiyorum.
“Satır sayısının işlem olarak fazlağı” ne oluyor anlamadım. @dildeolupbiten’in ne demek istediğini ben anladım zaten, sadece satır sayısının bu konuda bir sınırlama olmadığını söyledim. eval fonksiyonu birden fazla yeni satır karakteri içeren kodları çalıştırabilir. eval fonksiyonunun hangi kodları çalıştırabileceği verdiğim linkteki gramer ile kesin olarak belirlenmiş.
Ben sadece “n satırlık” ifadesinin anlamsız olduğunu düşündüğümü söylemeye çalıştım. Bunu bir fonksiyona verebileceğimiz parametreleri tarif ederken kullandınız ama bir tanım ifade etmediğini düşünüyorum.
İçinde birden fazla \n karakteri bulunan karakter dizilerini eval’e parametre olarak verebiliyoruz, satırdan anladığım da buydu.