python中強大但又危險的eval,可將字符串轉函數並執行

eval函數的危險性以及如何設置白名單進行規避風險,但是白名單設置複雜,相關內容參考

https://segmentfault.com/a/1190000011532358

 

其他方式如何規避:

一般情況,可以使用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()內的所有內容,將用戶輸入進行一定程度的拼接可以打亂原本的輸入,起到規避程序執行惡意輸入的作用

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章