Python 3.x 这是在python中使用eval()的安全方法吗?
我知道在用户输入上运行eval是非常危险的,像我在下面代码中所做的那样限制输入会消除所有危险吗Python 3.x 这是在python中使用eval()的安全方法吗?,python-3.x,security,eval,Python 3.x,Security,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=''
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', '2', '3', '4', '5', '6', '7', '8', '9', '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')
我很抱歉给您带来任何困惑。我无意中上传了一段我正在测试的代码,而不是我原本打算使用的工作代码,我已经将代码更新为工作代码。这是错误的<代码>如果我不在保险箱或num:中,它不会做您认为它会做的事情。此外,
else:continue
是多余的,它不符合OP的要求,即在将字符串传递给evalI之前先建立一个字符串,并对任何混淆表示歉意。我无意中上传了我正在测试的一段代码,而不是我原本打算使用的工作代码,我已经将代码更新为工作代码。我上传的代码已经达到了我的预期目的。我只是想知道是否有人能够向eval提供任何危险代码,或者在服务器上运行是否安全。至于测试一个完整的字符串,这是不必要的,因为我打算在Tkinter GUI中使用它。