📜  input()函数中的漏洞– Python2.x

📅  最后修改于: 2020-01-13 05:17:21             🧑  作者: Mango

本文旨在解释和探索Python 2.x中input()函数中的漏洞。在Python 3中,raw_input()函数被删除,其功能被转移到称为input()的新内置函数中。

在Python 2.x中输入数据的方法

在Python 2.x中有两种常见的接收输入的方法:

  1. 使用input()函数:此函数按原样输入类型输入,而无需修改任何类型。
  2. 使用raw_input()函数:此函数您提供的输入明确转换为字符串类型,

让我们使用以下程序确定两者之间的区别:

# Python 2.x程序,来展示 input() and rawinput()的区别
# 使用raw_input()函数,接收三个输入
# 输入之后将打印输入的数据类型
s1 = raw_input("输入值,来检测raw_input()函数: ")
print type(s1)
s2 = raw_input("输入值,来检测raw_input()函数: ")
print type(s2)
s3 = raw_input("输入值,来检测raw_input()函数: ")
print type(s3)
# 使用input()函数,接收三个输入 # 输入之后将打印输入的数据类型
s4 = input("输入值,来检测input()函数: ")
print type(s4)
s5 = input("输入值,来检测input()函数: ")
print type(s5)
s6 = input("输入值,来检测input()函数: ")
print type(s6)

Input:

Hello
456
[1,2,3]
45
"goodbye"
[1,2,3]

输出:

输入值,来检测raw_input()函数: 
输入值,来检测raw_input()函数: 
输入值,来检测raw_input()函数: 
输入值,来检测input()函数: 
输入值,来检测input()函数: 
输入值,来检测input()函数: 

注意:在input()函数中提供字符串输入时,我们必须将值括在双引号中。raw_input()不需要此操作
 

input()方法中的漏洞

input()方法中的漏洞在于,任何人只要使用变量或方法的名称,就可以访问输入值的变量。让我们一一探讨细节:

  1. 变量名称作为输入参数:具有输入变量值的变量可以直接访问输入变量的值。
    # Python 2.x 程序,用来展示input()的脆弱
    import random
    secret_number = random.randint(1,500)
    print "随机在1到500选一个数"
    while True:
        res = input("猜猜是什么数字: ")
        if res==secret_number:
            print "你赢了"
            break
        else:
            print "你输了"
            continue

    输入:

    15

    输出:

    随机在1到500选一个数
    猜猜是什么数字: 你赢了
    猜猜是什么数字:

    输入:

    secret_number

    输出:

    随机在1到500选一个数
    猜猜是什么数字: 你赢了

    可以看出,在第二种情况下,变量“ secret_number”可以直接作为输入给出,答案始终是“ 你赢了”。它像直接输入数字一样评估变量,这意味着它将始终返回True布尔值。如何修复?使用raw_input,因为它不允许直接读取变量,因此将是不可能的。

  2. 函数名称作为参数:漏洞就在这里,因为我们甚至可以提供函数名称作为输入和访问值:
    # Python 2.x 程序,来说明input()输入函数名称的脆弱性
    secret_value = 500
    # 返回一个秘密数的函数
    def secretfunction():
        return secret_value
    # 使用raw_input()来输入一个值
    input1 = raw_input("Raw_input(): 猜猜秘密数: ")
    # input1会被显示地转化成string类
    if input1 == secret_value:
        print "猜对了"
    else:
        print "猜错了"
    # 使用input()获取输入
    input2 = input("Input(): 猜猜秘密数: ")
    #input2将会被进行验证
    if input2 == secret_value:
        print "正确答案"
    else:
        print "错误答案"

    输入:

    400
    secretfunction()

    输出:

    Raw_input(): 猜猜秘密数: 猜错了
    Input(): 猜猜秘密数: 猜对了

    在这组输入/输出中,我们可以看到,当使用raw_input时,必须输入正确的数字。但是,在使用input()函数时,我们甚至可以提供函数或变量的名称,编译器将对其进行判断和评估。
    例如,在这里,已将input()函数的输入作为函数’secretfunction()’的名称给出。编译器将评估此函数调用并返回我们希望找到的秘密数,因此即使我们没有输入数值,我们的if条件也将为真。
    输入:

    secretfunction()
    secret_value

    输出:

    Raw_input(): 猜猜秘密数: 猜错了
    Input(): 猜猜秘密数: 猜对了
    1. 如第一点所述,在此示例中,我们还能够在输入中为“ input()”函数简单地输入变量名“ secret_number”,并且能够访问秘密数。
      但是,当尝试在raw_input()函数的输入中调用secretfunction()时,由于编译器将参数转换为字符串,并且不将其评估为函数调用,因此它为false。

    防止输入漏洞

    始终最好在Python 2.x中使用raw_input(),然后将输入显式转换为我们需要的任何类型。例如,如果我们希望输入整数,则可以执行以下操作

    n = int(raw_input())

    这样可以防止恶意调用或评估功能