4

ユーザーが numpy および scipy の関数を含む自己記述の数学関数を使用できるようにする必要があるプログラムを作成しています。scipy.special.wofz() .

これらの関数はファイルに保存され、プログラムによって文字列としてインポートされます。eval()またはexec()は安全な方法ではないことがわかりました。例えば。ここに

セキュリティ上の問題は、善意のユーザーが、善良なユーザーのシステムにアクセスできる悪意のあるユーザーからファイルをロードすることです。

私はこのようなことを考えていました:

#!/bin/python
from scipy.special import *
from numpy import *
import sympy

# Define variable a
vars = {"a":1}
# This is the string I get from a file
string = "wofz(a)"

parsed_string = sympy.sympify(string)
parsed_string.evalf(subs=vars)

ただし、これは機能しません。以下のみを返します。

wofz(a)

wofz(a) は評価されません。これはそのように機能するはずですか?

私には別の考えがありました。つまり、この数学関数が sympify を通過したら、安全であるはずだと考えました。私は単に次のようなことをすることができます:

globals = {wofz:wofz}
eval(str(parsed_string), vars, globals)

これは正常に動作し、次を返します。

(0.36787944117144233+0.60715770584139372j)

それは安全ですか?私はそれが良くないことを知っています。

助けてください。

4

2 に答える 2

4

sympy を使用すると、より安全なオプションになります。

import sympy
from sympy.core.function import Function
from sympy.core import S
from sympy import sympify
from sympy.functions import im
from scipy.special import wofz

class Wofz(Function):
    is_real = True
    @classmethod
    def _should_evalf(csl,arg):
        return True
    def as_base_exp(cls):
        return cls,S.One

    def _eval_evalf(cls, prec):
        return sympy.numbers.Number(im(wofz(float(cls.args[0]))))

print sympify("Wofz(2)",{'Wofz':Wofz}).evalf()

出力 (虚数部を何らかの方法で処理する必要があります):

0.340026217066065
于 2012-04-09T16:32:00.313 に答える
-2

文字列が信頼できない唯一の情報である場合、以下は安全であると思います。

制限された語彙で使用するeval()には、許可された名前の辞書である 2 番目の引数を渡します。ここで、__builtins__は無害なものに定義されます ( http://docs.python.org/library/functions.html#evalを参照)。

>>> import numpy as np
>>> d = dict(linspace=np.linspace, range=range, __builtins__=None)
>>> eval("str(1), 2+2")
('1', 4)
>>> eval("str(1)", d)
Traceback (most recent call last)
NameError: name 'str' is not defined

>>> eval("{'a': linspace(0, 0.5, 6)}, range(2)", d)
({'a': array([ 0. ,  0.1,  0.2,  0.3,  0.4,  0.5])}, [0, 1])
>>> eval("linspace.__dict__", d)
Traceback (most recent call last)
RuntimeError: function attributes not accessible in restricted mode
于 2012-04-24T12:10:31.167 に答える