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']}
)
在模型保存方法上运行,禁止任意字母数字命令。
这种方法是否有任何缺陷/其他风险?