Python input() 函数的漏洞
在本文中,我们将学习 input 函数在 2.x 或更早版本中如何表现出不良行为。在 2.x 版本中,raw_input() 函数可以替代 input() 函数。在 3.x 或更高版本中,这两个函数的所有理想特性和功能都合并到了 input() 函数中。
首先,让我们看看 Python 2.x 中用于获取输入的内置函数的输入类型。
示例
# Input Given : String str1 = raw_input("Output of raw_input() function: ") print type(str1) str2 = input("Output of input() function: ") print type(str2) # Input Given : Float str3 = raw_input("Output of raw_input() function: ") print type(str3) str4 = input("Output of input() function: ") print type(str4) # Input Given : Integer str5 = raw_input("Output of raw_input() function: ") print type(str5) str6 = input("Output of input() function: ") print type(str6)
输出
Output of raw_input() function: Output of input() function: Output of raw_input() function: Output of input() function: Output of raw_input() function: Output of input() function:
说明 − 从输出中可以很明显地看出,raw_input 函数会将输入显式转换为字符串类型,而不管提供的输入类型是什么。相反,input 函数会保留与输入期间提供的相同的数据类型。
现在,在看到上面的例子之后,您可能想知道,如果 input 函数保留数据类型,那么它为什么会有漏洞?让我们用一个例子来澄清这一点 −
示例 1:现在让我们使用 random 模块做一个掷骰子游戏。
示例
import random as rd number = random.randint(1,6) print ("Pick a number between 1 to 6") while True: user_input = input("Guess the number: ") if user_input==number: print ("You guessed it right.") break else: print ("OOPS! try it next time.") continue
说明 − 如果用户提供整数输入,则根据条件表达式将相应地计算期望输出。
如果用户提供字符串输入,即与我们使用 random 模块存储骰子生成的随机整数的变量名相同,则也会计算输出。但这不一定是我们想要计算的期望输出。实际上,当输入为字符串时,它应该引发错误,指出输入类型错误。它直接将变量名视为用户直接输入的数字,表达式产生 True 布尔值,游戏结束。相反,如果我使用 raw_input(),则不会遇到此问题。
如果我们存储登录凭据、用户详细信息和帐户密码,此漏洞可能会非常危险。
示例 2:现在让我们创建一个要求输入 PIN 码并与存储值进行比较的系统。
示例
stored_value = 7863 def return_function(): return stored_value inp = input() if inp == stored_value: print "You Entered Correctly" else: print "Oops! It's Incorrect"
说明
正如我们在前面的示例中讨论的那样,如果提供的输入是整数类型,则函数会正常工作。但是,如果用户提供的输入与函数的返回值相同,则条件变为 True,并产生输出。
在处理 PIN 码和密码等关键和机密信息时,使用此方法非常危险。这可以通过使用 Python 2.x 中提供的 raw_input() 来克服。
从以上两个示例可以清楚地看出,input 函数使程序容易受到直接变量攻击。
结论
在本文中,我们了解了在 Python 2.x 中使用 input() 函数时遇到的所有问题和漏洞。