사용자가 Python 객체의 임의 부분 을 요청할 수 있도록 허용하는 방법을 찾고 있으며, 서버가 실수로 허용되지 않는 항목을 요청하거나 허용되지 않는 작업을 수행하도록 허용하지 않고 해당 데이터를 반환하도록합니다. 할 것.
예를 들어 서버에 다음 데이터가 있다고 가정합니다.
my_stuff = {"alpha": ["bravo", "charlie", {"delta": "echo"}], "foxtrot": "golf"}
사용자가 다음과 같은 HTTP 요청을 보내도록 허용하고 싶습니다.
/path/to/my/script/?gimme=my_stuff[alpha][2][delta]
요청이 반환 echo
됩니다. 마찬가지로, gimme=foxtrot
I 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] 삭제
몇 마디 만하겠습니다