在Python / Django应用程序中使用eval()服务器端

时间:2015-07-23 21:08:53

标签: python django eval

Eval是邪恶的,rm -rf /等等......

但是让我们说出一些愚蠢的理由我实际上想利用eval的力量来做基本的计算和条件。

我想知道在我的服务器端代码中是否存在eval块的潜在风险,以及我可以采取哪些措施来缓解它们。

对于初学者来说,eval实际上会针对用户输入运行...我知道甚至更可怕。这些超级用户,理论上可以信任,但心怀不满的前雇员等总是一件事。

输入的预期用途是提供用于对已解析的电子表格进行计算的公式。例如,预期输入将类似于:

({{Column A}} + {{Column B}}) * {{Column C}}

然后在此值上运行正则表达式引擎,以使用适当的列值替换所有大括号值,以将语句转换为:

(5 + 6) * 11

然而,单独留下,我认识到他们可以做类似的事情:

from subprocess import call; call(["rm", "-rf", "/"])

所以,我们的想法是提出一个干净的方法,允许: 1)字符串值有效 2)括号内的任何内容都有效,因为它不会被评估为eval&d; d 3)其他任何包含字母数字字符的内容都无效。

到目前为止,我得到的是:

import re
from django import forms

def eval_template_clean(self, value, fieldname):
    # remove bracket items as they will be replaced and not evaluated
    value = re.sub("{{.*?}}", "", value)
    # remove string values as they are valid
    value = re.sub("\".*?\"", "", value)
    value = re.sub("\'.*?\'", "", value)
    # if any alpha characters remain, throw an error
    if re.search('[a-zA-Z]', value):
        raise forms.ValidationError(
            {fieldname: ['All your base are belong to us']}
        )

在模型保存方法上运行,禁止任意字母数字命令。

这种方法是否有任何缺陷/其他风险?

0 个答案:

没有答案