如何避免exec()的安全风险

时间:2018-10-03 04:56:50

标签: python-3.x exec dynamic-variables

我正在做一个测试Web服务项目,我需要在其中创建一些动态变量。为了实现这一点,我别无选择,只能使用exec()函数,如下所示。

    for parameter in parameter_names:
        if parameter["type"] == "number":
            exec("%s= %s(request.args.get('%s'))"%(parameter["name"],"float",parameter["name"]))
            para_collection[parameter["name"]] = eval(parameter["name"])
        else:
            exec("%s= %s(request.args.get('%s'))"%(parameter["name"],"str",parameter["name"]))
            para_collection[parameter["name"]] = eval(parameter["name"])

这里我接受来自Web调用的值并将它们分配给动态变量名。即使这段代码给了我预期的结果,我仍然看到了StackOverflow帖子的数量,提到了exec()函数的安全风险。因此,我想评估此代码的安全性。

我需要测试哪些方案? 如果不是exec(),还有哪些选择?

1 个答案:

答案 0 :(得分:1)

您需要验证parameter["name"]是安全的。最好的方法是将允许用户提供的一组值列入白名单。实际上,攻击者可以对您的代码进行各种危险的操作,尤其是远程执行代码。

示例:攻击者为import os\nos.system("rm -rf *") #发送parameter["name"](假设使用Linux操作系统,但是攻击可以适应其他操作系统)。哎呀,您丢失了很多数据。

更笼统地说,当前的实现方式允许攻击者创建一个Web Shell或反向Shell,使他能够像本地用户一样在您的服务器上执行任何操作。

您的parameter["name"]可以采用什么格式?如果仅是字母数字,则验证可以是用于检查值是否与字母数字模式匹配的正则表达式。如果不是,则向用户返回400错误。如果有效,请继续执行该命令。

请参见指南:Secure Coding: Understanding Input Validation