【问题标题】:How to avoid the security risk of exec()如何规避exec()的安全风险
【发布时间】:2018-10-03 04:56:49
【问题描述】:

我正在做一个测试网络服务项目,我需要在其中创建一些动态变量。为了实现这一点,我别无选择,只能使用如下的 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"])

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

我需要测试哪些场景? 如果不是 exec() 有什么替代方案?

【问题讨论】:

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


    【解决方案1】:

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

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

    更一般地说,当前的实现允许攻击者创建一个 Web shell 或反向 shell,允许他在您的服务器上执行任何操作,就好像他在本地一样。

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

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

    【讨论】:

      猜你喜欢
      • 2011-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-25
      • 1970-01-01
      • 2011-09-14
      • 2010-11-24
      • 2013-07-07
      相关资源
      最近更新 更多