将 eval 与 argparse 保存一起使用吗?

Is using eval together with argparse save?

我使用 argparse 和 eval 来更改日志记录的日志级别。

parser = argparse.ArgumentParser(
        description="Adds New Location to the Snipe-IT Server")
parser.add_argument('-l', '--loglevel', type=str, default='WARNING', choices=['DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL'])
args = parser.parse_args()
logging.basicConfig(level=eval(f"logging.{args.loglevel}"))

不知这种情况下使用eval是否省事?我不知道在这种情况下选择是否限制了输入。

不,这不太安全。对于知识渊博的恶意用户来说,破解 argparse 模块以便能够通过 CLI 传递他们想要的任何东西并不难。

但是,此时他们还不如编写自己的恶意程序,而不是尝试将您的程序用作攻击媒介。

即使有人认为 eval 的这种非常具体的用法是安全的r 因为它的输入是经过验证的,所以有意使用一个函数,当一个安全的时候暴露出巨大的攻击面并且有简单的替代方案可用(getattr 在这种情况下)是一个非常值得怀疑的决定。

此外,代码库将来可能会发生变化(例如,清理代码可能会被删除或修改),使 eval 的使用比以前更容易受到攻击。

不管怎样,就用getattreval 几乎从来都不是正确的解决方案。

logging.basicConfig(level=getattr(logging, args.loglevel))