Ardho Ainullah - Sep 4, 2021

Fungsi eval dan risikonya pada python

python module

eval(expression, globals=None, locals=None)

Fungsi dari eval ini sendiri untuk memparsing atau merubah sebuah string menjadi sebuah sintaks murni python.

• paramater dalam fungsi eval()

expression - string

globals (opsional) - dictionary

locals (opsional) - dictionary

nah dalam kasus seperti apa, kita bisa menggunakan fungsi ini? oke

coba lihat contoh kode dibawah ini

a,b = 3,5

#pilihan: + / - *
opsi = input('nilai a sama b ingin diapakan? ')
print (a, opsi, b)

output

$ python3 eval.py

nilai a sama b ingin diapakan? +
3 + 5

Tentu kita tidak bisa bukan, untuk menampilkan hasil dari 3 + 5 tersebut. disinilah kita bisa menggakali nya dengan eval. lihat kode dibawah ini

a,b = 3,5
#pilihan: + / - *
opsi = input('nilai a sama b ingin diapakan? ')

#f: format string
print (eval(f'{a} {opsi} {b}'))

output

$ python3 eval.py
nilai a sama b ingin diapakan? +
8

Atau untuk lebih mudah memahaminya

var = "1+1"
print (var)
print (eval(var))

output

$ python3 eval.py
1+1
2

paham? paham lah masa gaa. jadi intinya dia itu bisa ngerubah sebuah string itu menjadi sintaks murni. btw Saya juga pernah implementasikan eval ini ke program simple random quiz math buatan saya, bisa cek disini untuk kodingannya.

Risk/Risiko

Tapi fungsi ini kurang bagus untuk digunakan jika tidak dipenuhi dengan validasi input atau penanganan yang mumpuni, jadi saya contohin seperti dibawah ini.

semisal dalam program kita itu ada module os yang sudah diimport, bisa saja user itu memasukan sebuah sintaks python untuk memanipulasi program yang sudah kita buat.

import os

nama = input('masukan nama: ')
print (eval(nama))

output

$ python3 eval.py

masukan nama: os.system("ls ../")
bin   dev  home  media  opt   root  sbin  sys  usr
boot  etc  lib   mnt    proc  run   srv   tmp  var

tentu sangat berisiko tinggikan? apalagi program kita itu berbasis web seperti menggunakan framework django, dalam form yang kita buat itu menggunakan fungsi eval, tentu akan mudah heker untuk… damn.