有没有办法遍历所有可以导入的模块

问题描述:

我需要阻止一些模块,我需要知道某些模块是否不导入它。所以我需要一种遍历所有模块的方法来查看模块是否有子模块,我需要阻止它。有没有办法遍历所有可以导入的模块

有没有办法检查所有已安装的模块是否存在我需要阻止的模块?我不需要跨平台解决方案。

+2

浏览器与它有什么关系? – 2011-03-17 20:22:35

+0

这个不清楚。你是否希望阻止python运行危险的站点包?因为你可以从你的安装中删除它们(可能对其他程序没有预见效果)。如果你想知道什么是进口,当然你可以通过或启用详细的进口... – theheadofabroom 2011-03-17 21:14:11

+0

不幸的是,我不能访问root帐户而不是事件到shell。如果我能我会做到这一点。 – jcubic 2011-03-17 21:28:03

这将防止@Jochen观察到的行为(假设你在名单内填入少许更充分地)

def __import__(name, globals={}, locals={}, fromlist=[], level=-1, oldfunc=__import__): 
    checklist = fromlist[:] 
    checklist.extend(name.split('.')) 
    for check in checklist: 
     if check in ('os', 'sys'): 
      print 'Uh-uh I\'m better than that...' 
      return 
    oldfunc(name, globals, locals, fromlist, level) 

尝试自己的网站上提供了:


>>> def __import__(name, globals={}, locals={}, fromlist=[], level=-1, oldfunc=__import__): 
    checklist = fromlist[:] 
    checklist.extend(name.split('.')) 
    for check in checklist: 
     if check in ('os', 'sys'): 
      print 'Uh-uh I\'m better than that...' 
      return 
    oldfunc(name, globals, locals, fromlist, level) 
>>> __import__('os') 
Uh-uh I'm better than that... 
>>> x = [__import__('os')] 
Uh-uh I'm better than that... 
>>> 

但它不会改变默认的import行为。它看起来像是在阻止它成为一个名字为'os'的文字。如果你可以找到一种方法来编辑实际的import行为来调用这个函数(我不希望这可能是有可能的,但值得研究),那么你可以允许带有危险进口名称的文字因为允许用户使用他们喜欢的变量名称,这将使您难以计算出您正在做什么来防止导入,并因此避开它...

+0

+1哇这真棒。我不能给你一笔赏金,因为我在阅读你的文章之前给它@Jochen。抱歉。 – jcubic 2011-03-19 01:06:48

+0

@jcubic该死的啊,我猜我学到了东西:P – theheadofabroom 2011-03-19 08:34:12

如果您只是想阻止模块,您可以使用sys.path变量来播放,并使用它来确保它只包含列入白名单的模块(或不包括列入黑名单的模块)。这样Python解释器将无法找到不允许的模块,因此任何这些模块的导入都将失败。

http://docs.python.org/tutorial/modules.html(见6.1.2:“模块搜索路径”)

+0

感谢您的回答,但我想执行python代码并阻止危险模块。这不起作用“import sys; sys.path = []; import os”。我从exec中阻止os(在这种情况下是os)。 – jcubic 2011-03-15 14:59:19

听起来像你想build a sandbox。 Python维基列出了一些good approaches

我看了看你的web应用,它是很容易破解:

  • 可以导入模块,如ctypes.utillogging或数百人的那import os, sys
  • 你甚至可以导入模块一样,直接x = [__import__("os")]
  • __builtins__['__import__']("os")工程太

和那些只是第一件事我试过了。

如果你真的想这样做,那么唯一合理的方法是建立一个安全模块的白名单。您必须通过每个模块的来源,并确定它们是否仅导入安全模块。

我不认为你可以在不更改Python解释器的情况下达到任何真正的安全性。有可能不那么明显的方式来获得这些模块,你必须找到他们。

+0

是的你的权利。这是为这个网站http://trypython.jcubic.pl/,我知道这个模块,但我不能在这台服务器上安装任何东西。不过谢谢。 – jcubic 2011-03-17 21:26:42

+2

@jcubic:该应用程序非常不安全,我设法加载os和sys并启动bash shell。 – 2011-03-17 22:49:03

+0

对于ctypes.util为+1。你有另外一个吗? – jcubic 2011-03-18 07:25:17

如果你正在尝试沙盒Python,唯一的实际实现我知道,没有OS支持提供这个是PyPy。一年或两年前,python-dev上有一个线程讨论沙盒问题,人们通过执行诸如窥视堆栈来获取本地不能导入的模块,字节码操作以及其他一些事情来破坏所有尝试。

也讨论了一些额外的答案here