Eval在Python中怎么安全使用

小樊
100
2024-06-17 23:57:57

在Python中,可以使用ast.literal_eval()函數(shù)來(lái)安全地評(píng)估字符串表達(dá)式,這個(gè)函數(shù)會(huì)解析并評(píng)估字符串表達(dá)式,但只允許使用字面值表達(dá)式,不允許使用任意代碼執(zhí)行。這樣可以避免使用eval()函數(shù)可能帶來(lái)的安全風(fēng)險(xiǎn)。例如:

import ast
s = "2 + 3"
result = ast.literal_eval(s)
print(result)  # 輸出 5

另外,如果需要評(píng)估簡(jiǎn)單的數(shù)學(xué)表達(dá)式,可以使用eval()函數(shù),并通過(guò)傳遞一個(gè)局部和全局環(huán)境變量字典,來(lái)限制代碼執(zhí)行的范圍。例如:

s = "__import__('os').system('rm -rf /')"
result = eval(s, {"__builtins__": {}}, {})

在這個(gè)例子中,我們通過(guò)傳遞一個(gè)只包含__builtins__的空字典來(lái)禁用內(nèi)置函數(shù),從而限制了eval()函數(shù)的功能。這樣可以增加安全性,但并不完全避免潛在的風(fēng)險(xiǎn)。因此,盡可能避免使用eval()函數(shù),除非確實(shí)需要評(píng)估動(dòng)態(tài)代碼。

0