Python如何考慮代碼注入安全?
問題描述
目前有一個python的項目,想加入第三方插件開發(fā)的一個功能。 插件的形式也就是一個PY文件,但是看了python安全這塊的文章后,發(fā)現(xiàn)python是動態(tài)的,很容易就注入到核心代碼,包括各種monkeypack之類的,如何做這塊才能安全呢?
PS: 現(xiàn)在有些在線課堂也有 在線編程的功能,他們怎么做到的安全呢?
# plug_hello.pydef hello(): print 'hello world'
# load.pyimport plug_hello plug_hello.hello()
正常這樣加載是沒問題,但是黑客就可以注入。
# plug_hello.pydef hello(): #在 Python 2中, 內(nèi)置對象可以通過魔法 __builtins__ 模塊進行訪問。一個已知的手段就是利用 __builtins__ 的可變性,這可能引起巨大災難 import __builtins__ __builtins__.False, __builtins__.True = True, False print 'hello world'
黑客這樣寫,整個程序的True 和 False 變量就會出問題,而且黑客使用py特性還能獲取和修改主程序任何運行函數(shù)類的源代碼,從而進一步的注入。
問題解答
回答1:這個問題我也不懂,需要問問專門做這方面的人
我只說說我的想法:
由于第三方的功能由你們制定,預先封裝好第三方需要用到組件模塊,利用sys.module設置模塊白名單,只允許第三方導入你們提供的模塊,其他模塊sys.module[mod] = None禁止導入
PS:在線編程網(wǎng)站都是在沙箱環(huán)境里運行用戶代碼的,破壞便破壞了,反正環(huán)境是虛擬,貌似跟你這個問題關聯(lián)不大
回答2:分享其中一個心得: 比如說, 文件處理時, 經(jīng)常習慣取個變量path, 但又經(jīng)常from os import path
可以這么用:
import os.path# import os.path后, 使用時, 需要完整輸入os.path# 相對于import os總模塊而言, import os.path能避免無用的引入path = os.path.join('/tmp', filename)回答3:
使用ast.literal_eval(), 只允許使用 string,bytes,number,tuples,lists,discts,set,booleans,None
ast.literal_eval(node_or_string)Safely evaluate an expression node or a string containing a Python literal or container display. The string or node provided may only consist of the following Python literal structures: strings, bytes, numbers, tuples, lists, dicts, sets, booleans, and None.
This can be used for safely evaluating strings containing Python values from untrusted sources without the need to parse the values oneself. It is not capable of evaluating arbitrarily complex expressions, for example involving operators or indexing.
Changed in version 3.2: Now allows bytes and set literals.
相關文章:
1. html5 - css3scale和rotate同時使用轉(zhuǎn)換成matrix寫法該如何轉(zhuǎn)換?2. 默認輸出類型為json,如何輸出html3. mysql 遠程連接出錯10060,我已經(jīng)設置了任意主機了。。。4. python的正則怎么同時匹配兩個不同結果?5. 數(shù)組排序,并把排序后的值存入到新數(shù)組中6. php多任務倒計時求助7. MySQL的聯(lián)合查詢[union]有什么實際的用處8. PHP訂單派單系統(tǒng)9. 為何 localStorage、sessionStorage 屬于html5的范疇,但是為何 IE8卻支持?10. win10 python3.5 matplotlib使用報錯
