Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 是否有方法遍历所有可以导入的模块_Python_Import_Module_Traversal - Fatal编程技术网

Python 是否有方法遍历所有可以导入的模块

Python 是否有方法遍历所有可以导入的模块,python,import,module,traversal,Python,Import,Module,Traversal,我需要阻止一些模块,我需要知道是否有一些模块没有导入它。所以我需要一种遍历所有模块的方法,看看一个模块是否有我需要阻止的子模块 是否有办法检查所有已安装的模块是否存在需要阻止的模块?我不需要跨平台解决方案。如果您只想阻止模块,您可以使用sys.path变量,并使用它确保它只包含白名单模块(或不包括黑名单模块)。这样,Python解释器将无法找到不允许的模块,因此这些模块的任何导入都将失败 (参见6.1.2:“模块搜索路径”)如果您只想阻止模块,您可以使用sys.Path变量并使用它确保它只包含白

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


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

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


(参见6.1.2:“模块搜索路径”)

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


(参见6.1.2:“模块搜索路径”)

听起来像是在尝试。pythonwiki列出了一些

我看了一下你的网络应用,很容易破解:

  • 您可以导入模块,如
    ctypes.util
    logging
    或其他数百个
    导入操作系统、系统的模块
  • 您甚至可以直接导入模块,如
    x=[\uuuuuu import\uuuuuuuu(“os”)]
  • \uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuiuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
这些只是我尝试的第一件事

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


不过,我认为如果不更改Python解释器,就无法实现任何真正的安全性。可能有一些不太明显的方法来获取这些模块,您必须找到它们。

听起来您正在尝试。pythonwiki列出了一些

我看了一下你的网络应用,很容易破解:

  • 您可以导入模块,如
    ctypes.util
    logging
    或其他数百个
    导入操作系统、系统的模块
  • 您甚至可以直接导入模块,如
    x=[\uuuuuu import\uuuuuuuu(“os”)]
  • \uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuiuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
这些只是我尝试的第一件事

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


不过,我认为如果不更改Python解释器,就无法实现任何真正的安全性。可能有一些不太明显的方法来获取这些模块,您必须找到它们全部。

这将阻止@Jochen观察到的行为(假设您将列表填充得更完整一些)


在您的网站上试用它可以提供:




但是,它不会更改默认的导入行为。看起来你不再是一个名字为“os”的文字了。如果你能找到一种方法来编辑实际的
import
行为来调用这个函数(我甚至不希望这是可能的,但值得一看),那么你就可以允许带有名称的文字与危险的导入类似——以及允许人们使用他们喜欢的变量名,这将使你更难弄清楚你在做什么来阻止导入,从而绕过它…

这将阻止@Jochen观察到的行为(假设你更充分地填充你的列表)


在您的网站上试用它可以提供:




但是,它不会更改默认的导入行为。看起来你不再是一个名字为“os”的文字了。如果你能找到一种方法来编辑实际的
import
行为来调用这个函数(我甚至不希望这是可能的,但值得一看),那么你就可以允许带有名称的文字与危险的导入类似——以及允许人们使用他们喜欢的变量名,这将使您更难确定您正在做什么来阻止导入,从而绕过它…

如果您试图对Python进行沙箱处理,我所知道的唯一一个在没有操作系统支持的情况下提供此功能的真正实现是。一两年前,Pythondev上有一个讨论沙箱的线程,人们打破了所有的尝试,他们做了一些事情,比如窥视堆栈以获取无法本地导入的模块、字节码操作和其他一百件事情


还讨论了几个额外的答案

如果您试图对Python进行沙箱处理,我所知道的唯一一个在没有操作系统支持的情况下提供此功能的真正实现是。一两年前,Pythondev上有一个讨论沙箱的线程,人们打破了所有的尝试,他们做了一些事情,比如窥视堆栈以获取无法本地导入的模块、字节码操作和其他一百件事情


还讨论了几个额外的答案

谢谢你的回答,但我想执行python代码并阻止危险的模块。“导入sys;sys.path=[];导入操作系统”不起作用。我知道如何从exec阻止操作系统(本例中的操作系统)。感谢您的回答,但我想执行python代码并阻止危险的模块。“导入sys;sys.path=[];导入操作系统”不起作用。我知道如何阻止exec的操作系统(本例中的操作系统)。浏览器与之有什么关系?这还不清楚。您希望阻止python运行危险的站点包吗?因为您可以从安装中删除它们(可能对其他程序产生不可预见的影响)。如果您想知道导入了什么,当然可以单步执行或启用详细imp
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...
>>>