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() 函数时遇到的所有问题和漏洞。

更新于:2019年8月29日

445 次浏览

开启您的职业生涯

完成课程后获得认证

开始学习
广告