好程式設計師Python培訓之詳解eval好與壞

好程式設計師發表於2020-11-06

   好程式設計師 Python 培訓之詳解 eval 好與壞 ,文中透過示例程式碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,下面我們一起來看一下吧。

   eval Python 的一個內建函式,這個函式的作用是,返回傳入字串的表示式的結果。想象一下變數賦值時,將等號右邊的表示式寫成字串的格式,將這個字串作為 eval 的引數, eval 的返回值就是這個表示式的結果。

   python eval 函式的用法十分的靈活,但也十分危險,安全性是其最大的缺點。本文從靈活性和危險性兩方面介紹 eval

   1 、強大之處

   舉幾個例子感受一下,字串與list tuple dict 的轉化。

   a = "[[1,2], [3,4], [5,6], [7,8], [9,0]]"

   b = eval(a)

   b

   Out[3]: [[1, 2], [3, 4], [5, 6], [7, 8], [9, 0]]

   type(b)

   Out[4]: list

   a = "{1: 'a', 2: 'b'}"

   b = eval(a)

   b

   Out[7]: {1: 'a', 2: 'b'}

   type(b)

   Out[8]: dict

   a = "([1,2], [3,4], [5,6], [7,8], (9,0))"

   b = eval(a)

   b

   Out[11]: ([1, 2], [3, 4], [5, 6], [7, 8], (9, 0))

   強大吧,給個字串給eval eval 給你一個表示式返回值。

   eval 的語法格式如下:

   eval(expression[, globals[, locals]])

   expression :字串

   globals :變數作用域,全域性名稱空間,如果被提供,則必須是一個字典物件。

   locals :變數作用域,區域性名稱空間,如果被提供,可以是任何對映物件。

   結合globals locals 看看幾個例子

   傳遞globals 引數值為 { age :1822}

   eval("{'name':'linux','age':age}",{"age":1822})

   輸出結果:{ name': linux', age':1822}

   再加上locals 變數

   age=18

   eval("{'name':'linux','age':age}",{"age":1822},locals())

   根據上面兩個例子可以看到當locals 引數為空, globals 引數不為空時,查詢 globals 引數中是否存在變數,並計算。

   當兩個引數都不為空時,先查詢locals 引數,再查詢 globals 引數, locals 引數中同名變數會覆蓋 globals 中的變數。

   2 、危險之處

   eval 雖然方便,但是要注意安全性,可以將字串轉成表示式並執行,就可以利用執行系統命令,刪除檔案等操作。

   假設使用者惡意輸入。比如:

   eval("__import__('os').system('ls /Users/chunming.liu/Downloads/')")

   那麼eval() 之後,你會發現,當前資料夾檔案都會展如今使用者前面。這句其實相當於執行了

   os.system('ls /Users/chunming.liu/Downloads/')

   那麼繼續輸入:

   eval("__import__('os').system('cat /Users/chunming.liu/Downloads/tls_asimov_cert.pem')")

   程式碼都給人看了。

   再來一條刪除命令,檔案消失。比如

   eval("__import__('os').system('rm /Users/chunming.liu/Downloads/ 車輛轉發測試 .png')")

   所以使用eval ,一方面享受他的了靈活性同時,也要注意安全性。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69913864/viewspace-2732683/,如需轉載,請註明出處,否則將追究法律責任。

相關文章