2013-10-02 2 views
7

내가 질문을 가지고, 더 큰 프로젝트에 대한 가능한 언어로 파이썬을 선택하는 나의 결정은 대답에 따라 달라집니다 - 나 자신에 올 수 없습니다 우리 모두는 파이썬이 더이 있는지 알지파이썬 객체 캡슐화 보안

real 개체 캡슐화이므로 개체의 "개인"속성과 같은 것이 없습니다. 이 문제와 관련하여 귀도 반 로섬 (Guido van Rossum)은 "우리는 모두 성인입니다", "그냥하지 마세요"와 같이 허용되지 않고 외래 물체의 숨겨진 부분에 액세스 할 수 있다고 말합니다. 필자가 작성한 소프트웨어가 내 손안에있는 한 나는 완벽하게 잘 살 수있다. 그래서 나는 내 자신의 실수에 책임이 있으며, 그런 것들을 피하려고 노력할 수있다.

확장 점이있는 일부 플러그인에서 플러그인 프레임 워크를 제공하고 많은 사람들이 다른 사람이 만든 플러그인을 사용하면 완전히 신뢰할 수없는 플러그인이 될 수 있습니다.

플러그인이 내 프레임 워크의 내부를 노출하지 못하게하려면 어떻게해야합니까?

이것을 달성 할 방법이 있습니까, 아니면 아무도 내 API를 악용하지 않는다는 자신감을 갖고있는 Python을 사용하는 유일한 방법입니까?

+2

Google 검색 용어 : [Sandbox python] (http://www.google.com/search?q=sandboxed+python). –

+2

이것이 보안 문제에 대해 실제로 생각하지 않습니다. 누가 무엇으로부터 보호 받고 있습니까? –

+2

나는 정말로 파이썬이 실제 객체 캡슐화를 가지고 있지 않다는 것을 안다. * : –

답변

16

private, public 등을 ("악의적 인 코드 및 외부 위협으로부터 보호"와 마찬가지로) 보안을 위해 절대로해서는 안됩니다. 그것들은 프로그래머가 (컴퓨터) 보안 조치가 아닌 발에 총격을 가하지 못하게하는 것을 의미합니다. 정적 컴파일러 검사를 건너 뛰고 메모리로 곧바로 이동하는 한 C++ 객체의 private 멤버 필드에 쉽게 액세스 할 수 있지만 C++에는 정확한 캡슐화가 없다고 말할 수 있습니까? C++를 들어

따라서 C++이나 Java의 악의적 인 플러그인에 대한 보안 수단으로는 private 또는 protected을 사용하지 않으므로 C#도 사용합니다.

가장 좋은 방법은 플러그인을 별도의 프로세스에서 실행하고 IPC/RPC 또는 웹 서비스를 통해 코어 API를 노출하거나(@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을 작성하기가 너무 쉽기 때문에. 제 3 자 클래스를 사용한다고해도 공개 API를 배우는 것은 대개 내가 맡기를 원하는 것만큼이나 많은 노력입니다. 다른 누군가의 액세스 제어가있는 범위 내에서 내부 구조를 엿볼 수있는 충분한 동기 부여를 느낀 적이 없습니다. 수업은 상당한 차이를 만들었을 것입니다. –

+0

@ErikAllik 대단히 고마워요. 제가 찾던 답변이었습니다. Java에서 비공개 멤버에 액세스하는 것이 가능하다는 것을 몰랐습니다. C++에서는 그렇게 생각 했었지만 여전히 부두 서랍에 넣었습니다. – nerdoc