gpt4 book ai didi

python - 使用 ast.literal_eval() 将字符串转换为日期时间的方法?

转载 作者:太空狗 更新时间:2023-10-29 17:26:23 26 4
gpt4 key购买 nike

我有一个字符串 "{'datetime': datetime.datetime(2010, 11, 21, 0, 56, 58)}" 我想将其转换为它所代表的对象。使用 ast.literal_eval() 给出:

ValueError: malformed string; 

因为它不允许构造对象(即 datetime 调用)。无论如何,要么让 ast 正确处理这个问题,要么保护 eval 以防止代码注入(inject)?

最佳答案

跟进 Ignacio Vazquez-Abrams'想法:

import ast
import datetime

def parse_datetime_dict(astr,debug=False):
try: tree=ast.parse(astr)
except SyntaxError: raise ValueError(astr)
for node in ast.walk(tree):
if isinstance(node,(ast.Module,ast.Expr,ast.Dict,ast.Str,
ast.Attribute,ast.Num,ast.Name,ast.Load, ast.Tuple)): continue
if (isinstance(node,ast.Call)
and isinstance(node.func, ast.Attribute)
and node.func.attr == 'datetime'): continue
if debug:
attrs=[attr for attr in dir(node) if not attr.startswith('__')]
print(node)
for attrname in attrs:
print(' {k} ==> {v}'.format(k=attrname,v=getattr(node,attrname)))
raise ValueError(astr)
return eval(astr)

good_strings=["{'the_datetime': datetime.datetime(2010, 11, 21, 0, 56, 58)}"]
bad_strings=["__import__('os'); os.unlink",
"import os; os.unlink",
"import(os)", # SyntaxError
]

for astr in good_strings:
result=parse_datetime_dict(astr)
print('{s} ... [PASSED]'.format(s=astr))

for astr in bad_strings:
try:
result=parse_datetime_dict(astr)
except ValueError:
print('{s} ... [REJECTED]'.format(s=astr))
else:
sys.exit('ERROR: failed to catch {s!r}'.format(s=astr))

产量

{'the_datetime': datetime.datetime(2010, 11, 21, 0, 56, 58)} ... [PASSED]
__import__('os'); os.unlink ... [REJECTED]
import os; os.unlink ... [REJECTED]
import(os) ... [REJECTED]

关于python - 使用 ast.literal_eval() 将字符串转换为日期时间的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4235606/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com