2016-11-30 13 views
0

まあ、そこにいるほとんどの人は、evalが悪いと言っています。それは99%の状況で真ですが、私が書いたコードのいくつかについてはevalを使っています。危険な?EVAL()。これは危険ですか?

私は元funtionalityを維持しながら、可能な限り最もなどのデータをサニタイズしようとしたが、これはevalを使用すると、何かが間違って行くことができます、このコードは下に実行することになっているすべての

import os 

try: 
    if os.environ["LANG"].rstrip('''\n''')[5:] == ".UTF-8": 
     Language = str(os.environ["LANG"].rstrip('''\n''').rstrip(os.environ["LANG"].rstrip('''\n''')[5:])) 
     eval (str("LP." + Language + "()")) 
    else: 
     raise Exception("Not an UTF-8 locale") 
except KeyError: 
    LP.Fallback() 
except AttributeError: 
    LP.Fallback() 

ファーストUNIXおよびデリバティブ

python2.7で書きました。

これは、LPクラス内のいくつかのメソッドを呼び出すことです。

私のコードはLANG VAR &の最後の5つの文字を削除したので、私はalredy、台無しrm -rf /またはsimilarsのように、私のPCに害を及ぼす可能性があり、任意の文字列に私のLANGシステム変数を変更しようとしている私のPCにしようとしたが、しました開始時にLP.を追加し、最後に()を追加すると、文字列の最後の5文字がUTF-8であるかどうかを最初から確認していることは言及せずにこのように表示されますが、その条件を削除した場合は "有害な"コマンドになります:

LP.rm -r()

これまでのところ、 5文字以上のコマンドは、「最後の5文字を​​削除」の行をバイパスすることはできません。また、LP. & ()を追加すると、害を防ぐことができます。

今まで、私は、任意の重大なエラーを回避するために、」.UTF-8" にしておこう...

答えて

3

私はすべてここにevalための何らかの理由を見ることができません。

LPの言語設定に対応するメソッドを取得しようとしています。それで、あなたはgetattr使用することができます。

lang = os.environ["LANG"].rstrip('''\n''') 
if lang.endswith(".UTF-8"): 
    ... 
+0

それが必要として、これは働いていた:

meth = getattr(LP, Language) result = meth() 

注意をrstripもの何度も実行する必要はありません。 'endswitch'と' getattr'について知りませんでした。そのような高速応答、ありがとう! P.S: 'eval'は他のコマンドと100%交換できますか?または、それが唯一の解決策であるときは時々ありますか? – PythonNoob

+1

私はそれが唯一の解決策である時があると確信しています。さもなければ、それは言語にまったくないでしょう。彼らはかなり珍しいはずです。 –

+0

すべての情報をありがとう。 – PythonNoob

関連する問題