将 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
的使用比以前更容易受到攻击。
不管怎样,就用getattr
。 eval
几乎从来都不是正确的解决方案。
logging.basicConfig(level=getattr(logging, args.loglevel))
我使用 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
的使用比以前更容易受到攻击。
不管怎样,就用getattr
。 eval
几乎从来都不是正确的解决方案。
logging.basicConfig(level=getattr(logging, args.loglevel))