91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

使用eval函數會有什么影響

發布時間:2020-07-02 13:52:15 來源:億速云 閱讀:201 作者:清晨 欄目:編程語言

小編給大家分享一下使用eval函數會有什么影響,希望大家閱讀完這篇文章后大所收獲,下面讓我們一起去探討方法吧!

如果你了解JavaScript或者PHP等,那么你一定對eval()所有了解。如果你并沒有接觸過也沒關系,eva()l函數的使用非常簡單。

>>> eval("1+1==2")     #進行判斷
True
>>> eval("'a'+'b'")    #字符連接
'ab'
>>> eval("4+5")        #數字相加
9
>>>1234567

Python中eval()函數將字符串str當成有效的表達式來求值并返回計算結果。其函數聲明如下:

eval(expression[, globals[, locals]])1
  • expression – 表達式。
  • globals – 變量作用域,全局命名空間,如果被提供,則必須是一個字典對象。
  • locals – 變量作用域,局部命名空間,如果被提供,可以是任何映射對象。

其中,globals 參數為字典形式,locals 為任何映射對象,它們分別表示全局和局部命名空間。如果傳人globals參數的字典中缺少__builtins__的時候,當前的全局命名空間將作為globals參數輸人并且在表達式計算之前被解析。locals 參數默認與globals相同,如果兩者都省略的話,表達式將在eval()調用的環境中執行。

“eval is evil”(eval是邪惡的),這是一句廣為人知的對eval的評價,它主要針對的是eval()的安全性。那么eval存在什么樣的安全漏洞呢?來看一個簡單的例子:

import sys
from math import *


def ExpCalcBot(string):
    try:
        print('Your answer is', eval(string))
    except NameError:
        print('The expression you enter is not valid')


print('Hi,I am ExpCalcBot.please input your experssion or enter e to end')
inputstr = ''
while 1:
    print('Please enter a number or operation.Enter c to complete')
    inputstr = raw_input()
    if inputstr == str('e'):
        sys.exit()
    elif repr(inputstr) != repr(''):
        ExpCalcBot(inputstr)
        inputstr = ''12345678910111213141516171819202122

上面這段代碼的主要功能是:根據用戶的輸人,計算Python表達式的值。它有什么問題呢?如果用戶都是素質良好,沒有不良目的的話,那么這段程序也許可以滿足基本需求。

比如,輸人1+sin(20)會輸出結果1.91294525073。但如果它是一個Web頁面的后臺調用(當然,你需要做一定的修改),由于網絡環境下運行它的用戶并非都是可信任的,問題就出現了。因為eval()可以將任何字符串當做表達式求值,這也就意味著有空子可鉆。上面的例子中假設用戶輸人_import_(“os”).system(“drr”),會有什么樣的輸出呢?你會驚訝地發現它會顯示當前目錄下的所有文件列表,輸出如下:
使用eval函數會有什么影響

于是頓時,有人的“壞心眼”來了,他輸人了如下字符串,可悲的事情發生了,當前目錄下的所有文件都被刪除了,包括test.py,而這一切沒有任何提示,悄無聲息。

__import__("os").system("del * /q") #!!!不要輕易在你的計算機上嘗試1

試想,在網絡環境下這是不是很危險?也許你會辯護,那是因為你沒有在globals參數中禁止全局命名空間的訪問。那么我們來嘗試一下

def ExpCalcBot(string):
    try:
        math_fun_list = ['acos', 'asin', 'atan', 'cos', 'e', 'log', 'log10', 'pi', 'pow', 'sin', 'sqrt', 'tan']
        math_fun_dict = dict([(k, globals().get(k)) for k in math_fun_list])  # 形成可以訪問的函數字典
        print('Your answer is', eval(string, {"__builtins__": None}, math_fun_dict))
    except NameError:
        print('The expression you enter is not valid')1234567

再次輸入__import__(“os”).system(“del * /q”) ,提示如下:
使用eval函數會有什么影響

安全問題不再是個問題!但同時又出現了新的問題,例如輸入以下字符:
[ c for c in ().class.bases[0].subclasses() if c.name==‘Quitter’ ]0(),其中
().class.bases[0].subclasses()用來顯示object類的所有子類。類Quitter與"quit"功能綁定,因此上面的輸入會直接導致程序退出

你可以在python的安裝目錄下的Lib\site.py中找到其類的定義。也可以自行在python解釋器中輸入print().class.bases[0].subclasses()查看輸出結果是什么。

因此對于有經驗的侵入者來說,他可能會有一系列強大的手段,使得eval可以解釋和調用這些方法,從而帶來更大的破壞。此外,eval()函數也給程序的調試帶來一定困難,要查看里面表達式具體的執行過程很難。因此在實際應用過程中如果使用對象不是信任源,應該盡量避免使用eval,在需要使用eval的地方可用安全性更好的ast.literal_eval替代。literaleval函數具體詳情可以參考文檔http://docs.pythonorg/2/library/ast.html#ast.literaleval。


看完了這篇文章,相信你對使用eval函數會有什么影響有了一定的了解,想了解更多相關知識,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

泸溪县| 西充县| 潜山县| 宝清县| 桐城市| 宝丰县| 湖南省| 阜新市| 克什克腾旗| 遵义县| 株洲县| 阿克| 松潘县| 遂宁市| 宁陵县| 闻喜县| 临泽县| 德惠市| 合山市| 太仆寺旗| 琼海市| 溧阳市| 赤水市| 西乌珠穆沁旗| 墨江| 浦江县| 西乡县| 宣化县| 鸡西市| 望江县| 乌拉特前旗| 漳平市| 专栏| 环江| 拜城县| 三都| 远安县| 威远县| 利津县| 珲春市| 定陶县|