小编Sud*_*him的帖子

限制Python的语法以安全地执行用户代码.这是一种安全的方法吗?

原始问题:

在python Web服务器上执行数学用户代码,最简单的安全方法是什么?

  • 我希望能够在python webserver上运行用户提交的代码.代码本质上是简单和数学的.

由于需要Python的一小部分,我目前的方法是通过遍历Python的抽象语法树将允许的语法列入白名单.功能和名称得到特殊待遇; 只允许明确列入白名单的函数,并且只允许使用未使用的名称.

import ast

allowed_functions = set([
    #math library
    'acos', 'acosh', 'asin', 'asinh', 'atan', 'atan2', 'atanh',
    'ceil', 'copysign', 'cos', 'cosh', 'degrees', 'e', 'erf',
    'erfc', 'exp', 'expm1', 'fabs', 'factorial', 'floor', 'fmod',
    'frexp', 'fsum', 'gamma', 'hypot', 'isinf', 'isnan', 'ldexp',
    'lgamma', 'log', 'log10', 'log1p', 'modf', 'pi', 'pow', 'radians',
    'sin', 'sinh', 'sqrt', 'tan', 'tanh', 'trunc',
    #builtins
    'abs', 'max', 'min', 'range', 'xrange'
    ])

allowed_node_types = set([
    #Meta
    'Module', 'Assign', 'Expr',
    #Control
    'For', 'If', 'Else',
    #Data
    'Store', 'Load', 'AugAssign', 'Subscript',
    #Datatypes …
Run Code Online (Sandbox Code Playgroud)

python security abstract-syntax-tree

9
推荐指数
1
解决办法
2333
查看次数

在python Web服务器上执行数学用户代码,最简单的安全方法是什么?

我之前已经意识到这个问题,但是这种情况略有不同.

我想运行一个python图像板(使用web.py),这将允许用户通过提交代码生成新图像.代码将采用单个函数的形式,它采用像素的x,y坐标并返回r,g,b值,例如:

def simpleGradient(xrel,yrel):
    r = xrel*256
    g = yrel*256
    b = 0
    return [r,g,b]
Run Code Online (Sandbox Code Playgroud)

只需要非常小的语法,它不一定是python.使用exec有限的范围似乎太不安全了,使用PyPy或VM似乎不必要地复杂(我对这一切都很新).

而不是沙箱化,是否有一种pythonic方式以更小的语言执行代码?是python的一个子集(解析和白名单?),还是我可以嵌入的数学导向语言?

python security web.py

8
推荐指数
1
解决办法
819
查看次数

Python子进程交互,为什么我的进程与Popen.communicate一起工作,而不是Popen.stdout.read()?

我正在尝试使用该subprocess模块与Python的命令行聊天机器人进行通信.(http://howie.sourceforge.net/使用编译的win32二进制文件,我有我的理由!)

这有效:

proc = Popen('Howie/howie.exe', stdout=PIPE,stderr=STDOUT,stdin=PIPE)
output = proc.communicate()
Run Code Online (Sandbox Code Playgroud)

但是Popen.communicate等待进程终止(并将其发送给EOF?),我希望能够与它进行交互.对此的明显解决方案是如此读stdout/写stdin:

这不起作用:

proc = Popen('Howie/howie.exe', stdout=PIPE,stderr=STDOUT,stdin=PIPE)
while True: print proc.stdout.readline()
Run Code Online (Sandbox Code Playgroud)

(请注意,我实际上使用的是基于http://code.activestate.com/recipes/440554/的更复杂的代码,但问题是相同的.)

问题是,第二种方法非常适合与cmd进行通信,但是当我运行聊天机器人时,什么都没有.所以我的问题是,在使用Popen.communicate()捕获输出时有什么不同?

即我可以使用第二种方法按照正常情况使用命令行,直到我运行chatbot,此时我停止接收输出.使用第一种方法正确显示机器人的前几行输出,但让我无法与它进行交互.

python subprocess stdout popen

6
推荐指数
1
解决办法
5991
查看次数