Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 这是在python中使用eval()的安全方法吗?_Python 3.x_Security_Eval - Fatal编程技术网

Python 3.x 这是在python中使用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

我知道在用户输入上运行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', '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中使用它。