깊은 Python 속성에 (안전하게) 액세스하기 위해 문자열을 사용하는 방법은 무엇입니까?

다니엘 퀸

사용자가 Python 객체의 임의 부분 을 요청할 수 있도록 허용하는 방법을 찾고 있으며, 서버가 실수로 허용되지 않는 항목을 요청하거나 허용되지 않는 작업을 수행하도록 허용하지 않고 해당 데이터를 반환하도록합니다. 할 것.

예를 들어 서버에 다음 데이터가 있다고 가정합니다.

my_stuff = {"alpha": ["bravo", "charlie", {"delta": "echo"}], "foxtrot": "golf"}

사용자가 다음과 같은 HTTP 요청을 보내도록 허용하고 싶습니다.

/path/to/my/script/?gimme=my_stuff[alpha][2][delta]

요청이 반환 echo됩니다. 마찬가지로, gimme=foxtrotI want to return golf.

나는 이것을 eval ()에 전달할 수는 없습니까? 보안에 미치는 영향만으로는 매우 나쁠 수 있지만 성능도 매우 좋다고 생각할 수 없습니다.

전체 변경 요청의 구문은 I 요건은 사용자가 요청할 수 있다는 것이다 서버 측 오브젝트의 임의의 부분을 ....하지만 단지 개체가 읽기 전용.

이 작업을 수행하는 안전 / 스마트 한 방법이 있습니까, 아니면 내가 미쳤습니까?

다니엘 퀸

Martijn Pieters는 저를 올바른 길로 안내했지만 reduce()다양한 객체 유형을 횡단하는 방법을 알아 내기위한 작업이 아직 남아 있었 으므로 여기에서 모든 것을 설명하겠습니다.

제 경우에는 my_stuff실제로 여러 가지 속성 유형을 가진 객체였습니다.

class Alpha(object):
    def __init__(self):
        bravo = [1, 2, 3]
        charlie = 7

class Delta(object):
    def __init__(self):
        echo = [Alpha(), Alpha()]
        foxtrot = {
            "golf": "hotel"
        }

그래서 reduce(dict.__getitem__, path, my_stuff)여기에서 일을 할 수없는 것처럼 간단한 것이 있습니다. 그러나 그것을 시작으로 사용하여 다음과 같이 끝났습니다.

def get_parsed_attribute(self, result, field_name):
    try:
        return reduce(self.smart_getattr, field_name.split("__"), result)
    except (AttributeError, IndexError):
        return None  # We can assume that either the value is missing, or
                     # that key doesn't exist.  Either way, there's no harm.


@staticmethod
def smart_getattr(obj, key):
    if isinstance(obj, list):
        return list.__getitem__(obj, int(key))
    if isinstance(obj, dict):
        return dict.__getitem__(obj, key)
    return getattr(obj, key)

이 코드는 우리가 어떤 종류의 객체를 다루고 있는지 알아 내고 적절한 getter를 실행합니다. 그래서 그것이 호출 될 때 reduce()Martijn이 제 간단한 사전에 제안한 것과 같은 효과를 얻습니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

해시 내 해시 구조의 데이터에 액세스하기 위해 문자열 설명을 사용하는 방법은 무엇입니까?

분류에서Dev

중첩 배열의 속성에 액세스하기 위해 배열을 올바르게 매핑하는 방법은 무엇입니까?

분류에서Dev

Python 3 : 문자 범위에 대해 문자열을 분할하는 방법은 무엇입니까?

분류에서Dev

프로젝트에서 커밋을 얻기 위해 Github 사용자의 Atom 피드에 액세스하는 방법은 무엇입니까? 또는 대안

분류에서Dev

상태보기의 사용자 지정 속성에 액세스하는 방법은 무엇입니까?

분류에서Dev

도우미에게 전달하기 위해 정적 문자열과 동적 속성을 결합하는 방법은 무엇입니까?

분류에서Dev

python3에서 검색을 사용하여 기본 문자열에서 공백 앞뒤에 하위 문자열을 얻는 방법은 무엇입니까?

분류에서Dev

Razor에 액세스하지 않고 Angular에서 사용하기 위해 ASP.NET MVC에서 자산을 번들로 묶는 방법은 무엇입니까?

분류에서Dev

문자열로 Python 사전 이름에 액세스하는 방법은 무엇입니까?

분류에서Dev

값에 액세스하기 위해 QLineEdit 이름을 늘리는 방법은 무엇입니까?

분류에서Dev

Python SQLite에서 IN 명령을 안전하게 사용하는 방법은 무엇입니까?

분류에서Dev

다른 클래스에 대한 종속성을 위해 @InjectMocks를 사용하는 방법은 무엇입니까?

분류에서Dev

scriplet 사용을 피하기 위해 jsp에서 "get"이라는 객체 메소드에 액세스하는 방법은 무엇입니까?

분류에서Dev

URL을 암호화하고 액세스가 거부 된 콘텐츠에 액세스하기 위해 해독하는 방법은 무엇입니까?

분류에서Dev

웹 사용을 위해 Spotfire IronPython 스크립트에서 임시 파일을 안전하게 사용하는 방법은 무엇입니까?

분류에서Dev

Python : 하위 문자열을 사용하여 목록에 문자열을 만드는 방법은 무엇입니까?

분류에서Dev

상위 개체 속성에 액세스하는 방법은 무엇입니까?

분류에서Dev

json 문자열을 C #의 객체로 변환 한 다음 해당 속성에 동적으로 액세스하는 방법은 무엇입니까?

분류에서Dev

문자열을 사용하여 속성 또는 메서드에 액세스하는 방법은 무엇입니까?

분류에서Dev

컨트롤러 작업에 대한 액세스를 제어하기 위해 RBAC 사용 규칙을 추가하는 방법은 무엇입니까?

분류에서Dev

Go에서 문자열을 (깊은) 복사하는 방법은 무엇입니까?

분류에서Dev

Haskell에서 "안전하게 임의의"문자열 토큰을 생성하는 방법은 무엇입니까?

분류에서Dev

Kotlin에서 문자열 속성을 올바르게 사용하는 방법은 무엇입니까?

분류에서Dev

cytoscape.js 및 qtip을 사용하여 JSON이 속성에 액세스하는 방법은 무엇입니까?

분류에서Dev

루트 액세스 및 SSH 키 기반 인증을 위해 sudo가 필요한 시스템에서 SFTP를 사용하는 방법은 무엇입니까?

분류에서Dev

루트 액세스 및 SSH 키 기반 인증을 위해 sudo가 필요한 시스템에서 SFTP를 사용하는 방법은 무엇입니까?

분류에서Dev

jQuery에서 영숫자에 하위 문자열을 사용하는 방법은 무엇입니까?

분류에서Dev

C ++ 문자열을 Rust에 안전하게 전달하는 방법은 무엇입니까?

분류에서Dev

Python에서 StrategyPattern을 사용하여 필드에 액세스하는 방법은 무엇입니까?

Related 관련 기사

  1. 1

    해시 내 해시 구조의 데이터에 액세스하기 위해 문자열 설명을 사용하는 방법은 무엇입니까?

  2. 2

    중첩 배열의 속성에 액세스하기 위해 배열을 올바르게 매핑하는 방법은 무엇입니까?

  3. 3

    Python 3 : 문자 범위에 대해 문자열을 분할하는 방법은 무엇입니까?

  4. 4

    프로젝트에서 커밋을 얻기 위해 Github 사용자의 Atom 피드에 액세스하는 방법은 무엇입니까? 또는 대안

  5. 5

    상태보기의 사용자 지정 속성에 액세스하는 방법은 무엇입니까?

  6. 6

    도우미에게 전달하기 위해 정적 문자열과 동적 속성을 결합하는 방법은 무엇입니까?

  7. 7

    python3에서 검색을 사용하여 기본 문자열에서 공백 앞뒤에 하위 문자열을 얻는 방법은 무엇입니까?

  8. 8

    Razor에 액세스하지 않고 Angular에서 사용하기 위해 ASP.NET MVC에서 자산을 번들로 묶는 방법은 무엇입니까?

  9. 9

    문자열로 Python 사전 이름에 액세스하는 방법은 무엇입니까?

  10. 10

    값에 액세스하기 위해 QLineEdit 이름을 늘리는 방법은 무엇입니까?

  11. 11

    Python SQLite에서 IN 명령을 안전하게 사용하는 방법은 무엇입니까?

  12. 12

    다른 클래스에 대한 종속성을 위해 @InjectMocks를 사용하는 방법은 무엇입니까?

  13. 13

    scriplet 사용을 피하기 위해 jsp에서 "get"이라는 객체 메소드에 액세스하는 방법은 무엇입니까?

  14. 14

    URL을 암호화하고 액세스가 거부 된 콘텐츠에 액세스하기 위해 해독하는 방법은 무엇입니까?

  15. 15

    웹 사용을 위해 Spotfire IronPython 스크립트에서 임시 파일을 안전하게 사용하는 방법은 무엇입니까?

  16. 16

    Python : 하위 문자열을 사용하여 목록에 문자열을 만드는 방법은 무엇입니까?

  17. 17

    상위 개체 속성에 액세스하는 방법은 무엇입니까?

  18. 18

    json 문자열을 C #의 객체로 변환 한 다음 해당 속성에 동적으로 액세스하는 방법은 무엇입니까?

  19. 19

    문자열을 사용하여 속성 또는 메서드에 액세스하는 방법은 무엇입니까?

  20. 20

    컨트롤러 작업에 대한 액세스를 제어하기 위해 RBAC 사용 규칙을 추가하는 방법은 무엇입니까?

  21. 21

    Go에서 문자열을 (깊은) 복사하는 방법은 무엇입니까?

  22. 22

    Haskell에서 "안전하게 임의의"문자열 토큰을 생성하는 방법은 무엇입니까?

  23. 23

    Kotlin에서 문자열 속성을 올바르게 사용하는 방법은 무엇입니까?

  24. 24

    cytoscape.js 및 qtip을 사용하여 JSON이 속성에 액세스하는 방법은 무엇입니까?

  25. 25

    루트 액세스 및 SSH 키 기반 인증을 위해 sudo가 필요한 시스템에서 SFTP를 사용하는 방법은 무엇입니까?

  26. 26

    루트 액세스 및 SSH 키 기반 인증을 위해 sudo가 필요한 시스템에서 SFTP를 사용하는 방법은 무엇입니까?

  27. 27

    jQuery에서 영숫자에 하위 문자열을 사용하는 방법은 무엇입니까?

  28. 28

    C ++ 문자열을 Rust에 안전하게 전달하는 방법은 무엇입니까?

  29. 29

    Python에서 StrategyPattern을 사용하여 필드에 액세스하는 방법은 무엇입니까?

뜨겁다태그

보관