Python 3.x 如何避免exec()的安全风险
我正在做一个测试web服务项目,需要在其中创建一些动态变量。要实现这一点,我别无选择,只能使用exec()函数,如followPython 3.x 如何避免exec()的安全风险,python-3.x,exec,dynamic-variables,Python 3.x,Exec,Dynamic Variables,我正在做一个测试web服务项目,需要在其中创建一些动态变量。要实现这一点,我别无选择,只能使用exec()函数,如follow for parameter in parameter_names: if parameter["type"] == "number": exec("%s= %s(request.args.get('%s'))"%(parameter["name"],"float",parameter["name"]))
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(),还有什么选择?您需要验证
参数[“name”]
是否安全。最好的方法是将允许用户提供的一组值列为白名单。实际上,攻击者可以对您的代码执行各种各样的危险操作,尤其是远程代码执行
示例:攻击者为参数[“name”]
发送import os\nos.system(“rm-rf*”)
(假设Linux操作系统,但攻击可适用于其他操作系统)。哎哟,你丢失了很多数据
更一般地说,当前的实现允许攻击者创建一个web shell或反向shell,使他能够像在本地一样在服务器上执行任何操作
您的参数[“name”]
可以采用什么格式?如果只是字母数字,则验证可以是一个正则表达式,用于检查值是否与字母数字模式匹配。如果不是,则向用户返回400错误。如果有效,则允许命令继续
请参阅指南:。您需要验证
参数[“name”]
是否安全。最好的方法是将允许用户提供的一组值列为白名单。实际上,攻击者可以对您的代码执行各种各样的危险操作,尤其是远程代码执行
示例:攻击者为参数[“name”]
发送import os\nos.system(“rm-rf*”)
(假设Linux操作系统,但攻击可适用于其他操作系统)。哎哟,你丢失了很多数据
更一般地说,当前的实现允许攻击者创建一个web shell或反向shell,使他能够像在本地一样在服务器上执行任何操作
您的参数[“name”]
可以采用什么格式?如果只是字母数字,则验证可以是一个正则表达式,用于检查值是否与字母数字模式匹配。如果不是,则向用户返回400错误。如果有效,则允许命令继续
请参阅指南: