国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

Python中eval帶來的潛在風險代碼分析

2020-02-16 11:01:55
字體:
來源:轉載
供稿:網友

0x00 前言

eval是Python用于執行python表達式的一個內置函數,使用eval,可以很方便的將字符串動態執行。比如下列代碼:

>>> eval("1+2")>>> eval("[x for x in range(10)]")[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

當內存中的內置模塊含有os的話,eval同樣可以做到命令執行:

>>> import os>>> eval("os.system('whoami')")win-20140812chj/administrator

當然,eval只能執行Python的表達式類型的代碼,不能直接用它進行import操作,但exec可以。如果非要使用eval進行import,則使用 __import__ :

>>> exec('import os')>>> eval('import os')Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<string>", line 1  import os     ^SyntaxError: invalid syntax>>> eval("__import__('os').system('whoami')")win-20140812chj/administrator

在實際的代碼中,往往有使用客戶端數據帶入eval中執行的需求。比如動態模塊的引入,舉個栗子,一個在線爬蟲平臺上爬蟲可能有多個并且位于不同的模塊中,服務器端但往往只需要調用用戶在客戶端選擇的爬蟲類型,并通過后端的exec或者eval進行動態調用,后端編碼實現非常方便。但如果對用戶的請求處理不恰當,就會造成嚴重的安全漏洞。

0x01 “安全”使用eval

現在提倡最多的就是使用eval的后兩個參數來設置函數的白名單:

Eval函數的聲明為 eval(expression[, globals[, locals]])

其中,第二三個參數分別指定能夠在eval中使用的函數等,如果不指定,默認為globals()和locals()函數中 包含的模塊和函數。

>>> import os>>> 'os' in globals()True>>> eval('os.system(/'whoami/')')win-20140812chj/administrator>>> eval('os.system(/'whoami/')',{},{})Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<string>", line 1, in <module>NameError: name 'os' is not defined

如果指定只允許調用abs函數,可以使用下面的寫法:

>>> eval('abs(-20)',{'abs':abs},{'abs':abs})>>> eval('os.system(/'whoami/')',{'abs':abs},{'abs':abs})Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<string>", line 1, in <module>NameError: name 'os' is not defined>>> eval('os.system(/'whoami/')')win-20140812chj/administrator

使用這種方法來防護,確實可以起到一定的作用,但是, 這種處理方法可能會被繞過 ,從而造成其他問題!

0x02 繞過執行代碼1

被繞過的情景如下,小明知道了eval會帶來一定的安全風險,所以使用如下的手段去防止eval執行任意代碼:

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 许昌县| 志丹县| 太白县| 浦江县| 贵德县| 宁安市| 齐河县| 福安市| 从江县| 渭南市| 通化县| 无为县| 正宁县| 顺义区| 革吉县| 剑河县| 安岳县| 武清区| 西丰县| 黄浦区| 句容市| 松原市| 梨树县| 拜城县| 贞丰县| 巫溪县| 河北区| 全南县| 娱乐| 方城县| 湟源县| 上高县| 元氏县| 四会市| 蓝田县| 临沧市| 宣汉县| 四平市| 永胜县| 张家川| 都江堰市|