相关疑难解决方法(0)

在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
查看次数

使用ast和白名单使python的eval()安全吗?

好.我知道 专家 ,你不应该永远使用Python的eval()不受信任的数据,直到永远.我并不比世界其他地方更聪明,甚至不应该尝试这个.但!无论如何,我要去.

我的基本问题是我正在编写一个小计算器评估程序,它将使用python语法的一个子集进行不可信的输入.我知道:使用plypyparsing并编写解析器然后我们去.通过传递全局和本地人来解决这个问题是eval()不行的.

我所看到的所有方法(并且一直保持冷漠)试图列举邪恶.在这里,我试图枚举 - 得到一个AST,只允许几个节点类型,然后验证任何调用是否属于一组白名单函数之一.这是一个迷你实现(和要点):

import ast
import math

SAFE_FX = {
    'exp': math.exp,
}

SAFE_NODES = set(
    (ast.Expression,
    ast.Num,
    ast.Call,
    ast.Name,
    ast.Load,
    ast.BinOp,
    ast.Add,
    ast.Sub,
    ast.Mult,
    ast.Div,)
)

class CleansingNodeVisitor(ast.NodeVisitor):
    def generic_visit(self, node):
        if type(node) not in SAFE_NODES:
            raise Exception("%s not in SAFE_NODES" % type(node))
        super(CleansingNodeVisitor, self).generic_visit(node)

    def visit_Call(self, call):
        if call.func.id not in SAFE_FX:
            raise Exception("Unknown function: %s" % …
Run Code Online (Sandbox Code Playgroud)

python security parsing eval

5
推荐指数
1
解决办法
2298
查看次数

标签 统计

python ×2

security ×2

eval ×1

parsing ×1

web.py ×1