2013-10-02 9 views
7

私は疑問を持っているし、大きなプロジェクトのための可能な言語としてPythonを選ぶ際に私の決定は、答えに依存して - 私は自分自身を考え出すことはできません。私たちは皆、Pythonは何を持っていることを知らないPythonのオブジェクトのカプセル化セキュリティ

realオブジェクトのカプセル化なので、オブジェクトの「プライベート」プロパティのようなものはありません。この問題に関して、グイド・ヴァン・ロッサムは、「私たちはすべて大人だ」、「ただしないでください」ということで、外国のオブジェクトの隠れた部分に「許可」されることなくアクセスできると言います。 私が書いたソフトウェアが自分の手で書かれている限り、私は自分の間違いの責任を負い、そのようなことを避けることができます。 いくつかの拡張ポイントを持つプラグインでプラグインフレームワークを提供し、多くのプラグインが他の人、多分私が完全に信用できないものである場合はどうすればよいですか?

フレームワークの内部にプラグインからアクセスできないようにするにはどうすればよいですか?

これを達成する方法はありますか、誰も私のAPIを悪用しないという自信を持ってPythonを使用する唯一の方法はありますか?

+2

Google検索用語:[Sandbox python](http://www.google.com/search?q=sandboxed+python) –

+2

これがセキュリティ上の問題とはどういうものなのでしょうか。誰が何から守られているのですか? –

+2

私は実際には、「私たちはPythonが実際のオブジェクトカプセル化を持っていないことを知っています」*: –

答えて

16

privatepublicなど(「悪意のあるコードや外部からの脅威からの保護」のように)セキュリティのために決して実際に頼るべきではありません。彼らは、(コンピュータの)セキュリティ手段としてではなく、プログラマーが足に自分を撃ってしまうのを防ぐためのものです。また、静的なコンパイラチェックをバイパスしてメモリに直接移動する限り、C++オブジェクトのプライベートメンバーフィールドに簡単にアクセスできますが、C++には真のカプセル化がないと言うでしょうか? C++については

C++やJavaの悪意のあるプラグインに対するセキュリティ対策として、実際にprivateまたはprotectedを使用することは決してありません。私はC#も想定しています。

プラグインを別のプロセスで実行し、コアAPIをIPC/RPCまたはWebサービスで公開するか、sandbox(@MarkHildrethが指摘した内容)で実行することをお勧めします。また、プラグインの証明書と署名プロセスを設定して、潜在的な悪意のあるプラグインが配布される前にそれを見直してフィルタリングすることができます。

注:

def Foo(param): 
    param = [param] # because `nonlocal` was introduced only in 3.x 
    class _Foo(object): 
     @property 
     def param(self): 
      return param[0] 
     @param.setter 
     def param(self, val): 
      param[0] = val 
    return _Foo() 

foo = Foo('bar') 
print foo.param # bar 
foo.param = 'baz' 
print foo.param # baz 
# no way to access `foo._param` or anything 

...それでも、値は反射を経て、まだ実際には比較的に簡単にアクセスできます::

あなたが実際にレキシカルクロージャを使用して、真のカプセル化を達成することができます

>>> foo.__class__.param.fget.__closure__[0].cell_contents[0] = 'hey' 
>>> foo.param 
'hey' 

...そしてこれができなかった場合でも、我々はまだ残っている化粧品の「制約」バイパスし、ダイレクトメモリアクセスを可能にするctypesが残っているはずだ:

import ctypes 
arr = (ctypes.c_ubyte * 64).from_address(id(foo)) 

を、今あなただけarrに割り当てることができるか、それから読み取ります; .paramが格納されている実際のメモリ位置までポインタをトラバースするためには苦労しなければなりませんが、それはその点を証明します。

+3

よく置いてください。この回答自体は非常に役に立つだけでなく、これらのリンクも非常に興味深く便利です。あなたはカプセル化がセキュリティ対策ではなくプログラミングツールのほうが良いという非常に優れた区別をしました。 – Gray

+1

+1。私はPythonの実際のアクセス制御が不足していることを嘆く傾向がありますが、それは私自身のクラスで虚構なOOPを書くのが簡単すぎるからです。第三者のクラスであっても、公開APIを学ぶことは、私が通常気に入っているように努力しています。他の人のアクセス制御がある範囲で内部を突き刺すのに十分な意欲を感じたことはありません。クラスはかなりの違いをもたらしていました。 –

+0

@ErikAllikありがとう、これは私が探していた答えでした。 Javaでプライベートメンバーにアクセスすることが可能であるかどうかはわかりませんでした。私はそう思っていましたが、私はまだブードゥーの引き出しに入れました... – nerdoc

関連する問題