写点什么

Python 教程之输入输出(5)—— input() 函数中的漏洞 – Python 2.x

  • 2022 年 8 月 05 日
  • 本文字数:2193 字

    阅读完需:约 7 分钟

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

在 Python 2.x 中输入数据的不同方式

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

  1. 使用 input() 函数: 此函数按原样获取您输入的输入的值和类型,而无需修改任何类型。

  2. 使用 raw_input() 函数:此函数将您提供的输入显式转换为字符串类型,

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

# Python 2.x 程序显示两者之间的差异# input() 和 rawinput() 函数
# 使用 raw_input() 函数的 3 个输入,# 之后显示输入值的数据类型s1 = raw_input("Enter input to test raw_input() function: ")print type(s1)
s2 = raw_input("Enter input to test raw_input() function: ")print type(s2)
s3 = raw_input("Enter input to test raw_input() function: ")print type(s3)
# 使用 input() 函数的 3 个输入,# 之后显示输入值的数据类型s4 = input("Enter input to test input() function: ")print type(s4)
s5 = input("Enter input to test input() function: ")print type(s5)
s6 = input("Enter input to test input() function: ")print type(s6)
复制代码

输入:

Hello456[1,2,3]45"goodbye"[1,2,3]
复制代码

输出:

Enter input to test raw_input() function: <type 'str'>Enter input to test raw_input() function: <type 'str'>Enter input to test raw_input() function: <type 'str'>
Enter input to test input() function: <type 'int'>Enter input to test input() function: <type 'str'>Enter input to test input() function: <type 'list'>
复制代码

注意: 在 input() 函数中输入字符串时,我们必须用双引号将值括起来。这在 raw_input() 中不是必需的

input() 方法中的漏洞

input() 方法的漏洞在于,任何人都可以通过使用变量或方法的名称来访问访问输入值的变量。让我们一一探讨:

变量名作为输入参数:

具有输入变量值的变量能够直接访问输入变量的值。

Python 2.x 程序使用变量显示 input() 函数中的漏洞

import randomsecret_number = random.randint(1,500)print "Pick a number between 1 to 500"while True:	res = input("Guess the number: ")	if res==secret_number:		print "You win"		break	else:		print "You lose"		continue
复制代码

Python 3 演示 input() 函数的差异

import randomsecret_number = random.randint(1,500)print ("Pick a number between 1 to 500")while True:	res = input("Guess the number: ")	if res==secret_number:		print ("You win")		break	else:		print ("You lose")		continue
复制代码

输入:

15
复制代码

输出:

Pick a number between 1 to 500Guess the number: You loseGuess the number: 
复制代码

输入:

secret_number
复制代码

输出:

Pick a number between 1 to 500Guess the number: You win
复制代码

可以看出,在第二种情况下,变量“secret_number”可以直接作为输入给出,答案总是“你赢了”。它像直接输入数字一样评估变量,这意味着它始终返回 True Boolean。无法使用 raw_input,因为它不允许直接读取变量。

Python 3 显示了不同的结果。如果“secret_number”作为输入,答案是“You lose”。

函数名作为参数:

漏洞就在这里,因为我们甚至可以提供函数的名称作为输入并访问原本不应该访问的值。

# Python 2.x 程序通过传递函数名作为参数来演示 input() 函数漏洞secret_value = 500
# 返回秘密值的函数def secretfunction(): return secret_value
# 使用 raw_input() 输入数字input1 = raw_input("Raw_input(): Guess secret number: ")
# input1 将被显式转换为字符串if input1 == secret_value: print "You guessed correct"else: print "wrong answer" # 使用 input() 输入数字input2 = input("Input(): Guess the secret number: ")
# input2 在输入时进行评估if input2 == secret_value: print "You guessed correct"else: print "wrong answer"
复制代码

输入:

400secretfunction()
复制代码

输出:

Raw_input(): Guess secret number: wrong answerInput(): Guess the secret number: You guessed correct
复制代码

在这组输入/输出中,我们可以看到,当我们使用 raw_input 时,我们必然要输入正确的数字。然而,在使用 input() 函数时,我们甚至可以提供函数或变量的名称,解释器将对其进行评估。例如,这里的 input() 函数的输入被指定为函数“secretfunction()”的名称。解释器评估这个函数调用并返回我们希望找到的秘密数字,因此即使我们没有输入秘密数字,如果条件评估为真,我们也会返回:

secretfunction()secret_value
复制代码

输出:

Raw_input(): Guess secret number: wrong answerInput(): Guess the secret number: You guessed correct
复制代码

正如第一点所解释的,在这个例子中,我们也能够在“input()”函数的输入中简单地输入变量名“secret_number”,我们就能够访问秘密值。然而,当试图在 raw_input() 函数的输入中调用 secretfunction() 时,它给了我们错误,因为解释器将我们的参数转换为字符串,并且不将其评估为函数调用。

防止输入漏洞

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

n = int(raw_input())
复制代码

这可以防止恶意调用或评估函数。

发布于: 刚刚阅读数: 5
用户头像

公众号:海拥 2021.11.29 加入

【个人网站】haiyong.site 【联系方式】微信:wh18363 【软件技能】前端,Java,Python 【个人称号】InfoQ 写作社区签约作者,华为云享专家,CSDN原力作者,全栈领域优质创作者,掘金2021年度人气作者No.21

评论

发布
暂无评论
Python 教程之输入输出(5)—— input() 函数中的漏洞 – Python 2.x_Python_海拥(haiyong.site)_InfoQ写作社区