eval函數的危險性以及如何設置白名單進行規避風險,但是白名單設置複雜,相關內容參考
其他方式如何規避:
一般情況,可以使用ast.literal_eval()函數是可以代替eval()。但是ast.literal_eval()在將字符串轉成函數進行調用時,很可能會報錯。可以使用
聲明:以下純屬個人觀點,歡迎指正
這時還是要用eval(),但用戶可能在eval中輸入以下
eval("open(r'D://filename.txt', 'r').read()") # 讀取文件
eval("__import__('os').system('dir')") # 獲取文件目錄
eval("__import__('os').system('rm -rf /etc/*')") # 當/etc不存在時就會直接執行/*,有多恐怖自己想
所以簡單的方法是eval()內的輸入不能讓用戶進行選擇,我們可以將用戶輸入進行一定程度的拼接,從而規避此類風險,例如:
Pj_id = '00000001' # 項目號,由用戶輸入
code = '01' # 編碼,可以由用戶輸入
Sys = 'sys01' # 系統編碼 可以由用戶輸入
num = 10 # 一個輸入數字
time = 50 # 秒
eval("c" + code+ "_" + Sys+ ".P9('{i}',{j}, {n})".format(i=Pj_id, j=num,n=time))
這裏會調用 c01_sys01這個python文件下的P9函數,並且傳入了Pj_id ,num,time三個參數,注意它們都在一個字符串內,這樣遭遇惡意輸入時,程序會直接報錯,也不會執行,因爲它無法構成一個可執行的函數.
總結:切記不能讓用戶直接輸入eval()內的所有內容,將用戶輸入進行一定程度的拼接可以打亂原本的輸入,起到規避程序執行惡意輸入的作用