如何解决这是在python中使用eval的安全方法吗?
我知道在用户输入上运行eval是非常危险的,像在下面的代码中所做的那样限制输入是否消除了所有危险?
q=''
safe=['1','2','3','4','5','6','7','8','9','0','+','-','*','/','(',')','.']
while True:
i= input('input = ')
if i == 'exit':
exit('Shutting Down.')
elif i in safe:
q += i
elif i == '=':
print(eval(q))
else:
print('no')
如果它仍然包含漏洞,是否有某种方法可以将符号添加到数字字符串中并计算答案?我知道我可以简单地使用float()将字符串数字转换为实际数字,但是我不知道如何将'+'作为+加上,以便可以在计算中使用。
编辑:切换了代码,因为我不小心上传了错误的代码
解决方法
如果要检查整个输入字符串,可以将安全字符放入集合中,然后将输入内容与安全集合进行比较。
尝试以下代码:
safe=['1','2','3','4','5','6','7','8','9','0','+','-','*','/','(',')','.']
safeall = set(safe) # all safe characters
while True:
i= input('input = ').strip()
if i == 'exit':
exit('Shutting Down.')
if safeall & set(i) == set(i): # if input in safe characters
print('Safe')
print(eval(i))
else:
print('Not Safe')
输出
input = test123
Not safe
input = ##$$%%
Not safe
input = 12 + 67
Safe
79
input = exit
Shutting Down.
,
我无法使它正常工作
elif i in safe:
q += eval(i
返回错误,因为它将始终是不完整的表达式。
如果您试图允许用户评估方程式,则可以遍历字符串以查找任何不安全的字符
q=''
safe=['+','.']
num=['1','0']
def is_safe(string: str):
for i in string:
if i not in safe or num:
print('no')
return False
else:
continue
return True
while True:
i= input('input = ')
if i == 'exit':
exit('Shutting Down.')
else:
if is_safe(i):
print(eval(i))
else:
print('no')
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。