Python
 Computer >> コンピューター >  >> プログラミング >> Python

input()関数のPythonの脆弱性


この記事では、バージョン2.xで入力関数が望ましくない方法でどのように動作するかについて学習します。またはそれ以前。バージョン2.xでは。 raw_input()関数は、input()関数の代わりとして機能します。新しいバージョン3.xでは。または後で、両方の関数のすべての望ましい機能がinput()関数にマージされます。

まず、Python2.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関数は、提供された入力のタイプに関係なく、入力を文字列型に明示的に変換することは非常に明白です。それどころか、入力関数は入力中に提供されたものと同じデータ型を保持します。

上記の例を見た後、入力関数がデータ型を保持しているのに、なぜ脆弱なのか疑問に思われるかもしれません。イラストを使ってこれを明確にしましょう-

イラスト1:ランダムモジュールを使ってサイコロゲームを作ってみましょう。

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

説明 −ユーザーが整数入力を提供した場合、条件式に従って目的の出力がそれに応じて計算されます。

ユーザーが文字列入力を提供した場合、つまり、ランダムモジュールを使用してサイコロによって生成されたランダム整数を格納する変数名と同じ場合、出力も計算されます。しかし、これは私たちが計算したい望ましい出力であってはなりません。実際には、文字列入力時に間違った入力タイプを伴うエラーが発生する必要があります。変数名はユーザーが直接入力した数値と同等であると見なされます。式は真のブール値を生成し、ゲームは終了します。逆に、代わりにraw_input()を使用した場合、そのような問題は発生しません。

ログインクレデンシャル、ユーザーの詳細、アカウントのパスワードを保存している場合、この脆弱性は致命的となる可能性があります。

イラスト1:では、ピンを要求し、保存されている値と比較するシステムを作成しましょう。

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()を使用することで解決できます。

上記の2つの図から、入力関数によってプログラムが直接変数攻撃に対応できるようになることは明らかです。

結論

この記事では、Python 2.xでinput()関数を使用しているときに発生するすべての問題と抜け穴について学びました。必要です。


  1. Pythonのissubset()関数

    この記事では、Python標準ライブラリで利用可能なissubset()関数の実装と使用法について学習します。 issubset()メソッドは、セットのすべての要素が別のセットに存在する場合(引数として渡される場合)はブール値のTrueを返し、それ以外の場合はブール値のFalseを返します。 下の図では、BはAのサブセットです。AとBが同一のセットである場合、AはBの適切なサブセットであることを意味します。これは、両方のセットに同じ要素が含まれていることを意味します。 構文 <set 1>.issubset(<set 2>) 戻り値 boolean True/

  2. Intersection()関数Python

    この記事では、任意のセットで実行できるintersection()関数について学習します。数学によると、共通部分とは、2つのセットから共通の要素を見つけることを意味します。 構文 <set name>.intersection(<set a1> <set a2> ……..) 戻り値 引数として渡されるセット内の共通要素。 例 set_1 = {'t','u','t','o','r','i','a','l&