Eyes, JAPAN Blog > python 気をつけるべき関数と仕様

python 気をつけるべき関数と仕様

beko

この記事は1年以上前に書かれたもので、内容が古い可能性がありますのでご注意ください。

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コーディング中に起こる小さなバグ(仕様)だが情報漏洩の窓になるので確実になくしておきたいです。

Comments are closed.