開発
python 気をつけるべき関数と仕様
beko
pythonでコーディングする際、気をつけなければならない関数があります。すべては紹介できませんが一部見ていきましょう。
eval関数
この関数は、式を評価するのに使われます。pythonに限らず他言語にも現れます。
>>>a = "5+5" >>>eval(a) 10
しかし、この関数はコマンドを実行することもできます。
>>> eval("__import__('os').system('uname -a')", {}) Linux ubuntu 3.13.0-24-generic #4...........
これはとても危険ですね。もし入力が数式しかこないだろうとユーザーを信じているのなら気をつけましょう。対策は、この関数を使わないようにします。面倒ですが、文字列数式からパースをし数字と演算子をバラバラに取り出し計算させるのが無難だと思います。
input関数
この関数はユーザーから入力を受け取る単純な関数です。その危険さ故、熟練者が素早くコーディングするために使われています。python初学者が「これは便利!」と使ってしまうかも知れません。
Secret = "A SECRET DATA" Public = "a BANANA" value = input("Please enter your age ") print "There are",value, print "monkeys looking for",Public
とってもシンプルでいいのですがユーザーを信じています。あそこに正直に年齢を打ち込むわけないじゃないですか。任意の組み込み関数をぶち込みます。
Please enter your age dir() There are ['Public', 'Secret', '__builtins__', '__d........
xrange関数
xrange関数はかなり大きめに範囲をとるときに有効です。range関数は、メモリを一気に確保しにいくので大きく確保するとき足りなくなることもあります。
import sys N = 2 ** 63 for n in xrange(N): print n sys.exit(0)
オーバーバッファーフローを引き起こします。
Traceback (most recent call last): File "overfl-1.py", line 8, in <module> for n in xrange(N): OverflowError: Python int too large to convert to C long
整数型オブジェクトを生成しているのが原因で長整数型オブジェクトを生成するようにコアライブラリを変更しなければいけません。
pythonのprivate
pythonでメソッド、変数のアクセスを制限するとき、privateをセットすることができます。
#!/usr/bin/python class Animal: def __init__(Self): print 'cat' def kingofanimal(self): print 'lion' def __private(self): print 'phoenixes' sato = Animal() sato.kingofanimal() sato.private()
実行結果は、
cat lion Traceback (most recent call last): File "pri.py", line 15, in <module> sato.private() AttributeError: Animal instance has no attribute 'private'
やはり、privateへのアクセスは拒否されました。しかし、これは回避されます。
#!/usr/bin/python class Animal: def __init__(Self): print 'cat' def kingofanimal(self): print 'lion' def __private(self): print 'phoenixes' sato = Animal() sato._Animal__private()
結果は、
cat phoenixes
このように直接アクセスできます。
この他にもたくさんございます。
今回こちらを参考にしました。
OWASP Python Security WIKIHome · ebranca/owasp-pysec Wiki · GitHub
これらはpythonコーディング中に起こる小さなバグ(仕様)だが情報漏洩の窓になるので確実になくしておきたいです。