[json] JSON 결과에서 함수를 정의하는 것이 유효합니까?

웹 사이트의 JSON 응답에 다음이 포함되었습니다 (… 컨텍스트를 위해 추가됨).

{..., now:function(){return(new Date).getTime()}, ...}

JSON에 익명 함수를 추가하는 것이 유효합니까? ‘시간’에 액세스 할 때마다 다른 값이 반환 될 것으로 예상합니다.



답변

아니.

JSON은 순전히 데이터 설명 언어를 의미합니다. http://www.json.org 에서 언급했듯이 “경량 데이터 교환 형식”입니다. -프로그래밍 언어가 아닙니다.

http://en.wikipedia.org/wiki/JSON , 지원하는 ‘기본 유형’입니다 :

  • 숫자 (정수, 실수 또는 부동 소수점)
  • 문자열 (백 슬래시 이스케이프가있는 큰 따옴표 유니 코드)
  • 부울 (true 및 false)
  • 배열 (순서있는 값 시퀀스, 쉼표로 구분되고 대괄호로 묶임)
  • 객체 (키 : 값 쌍 모음, 쉼표로 구분되고 중괄호로 묶임)
  • null

답변

문제는 데이터 정의 언어 인 JSON이 JSON에서 JavaScript Object Notation으로 발전했다는 것입니다. Javascript는 JSON에서 eval을 지원하므로 JSON 코드를 JSON 안에 넣는 것이 합법적입니다 (해당 사용 사례에서). JSON을 사용하여 데이터를 원격으로 전달하는 경우 클라이언트-서버 상호 작용을 잘 모델링하지 않았을 수 있기 때문에 JSON에 메서드를 넣는 것이 좋지 않다고 말합니다. 또한 JSON을 데이터 설명 언어로 사용하려는 경우 일부 JSON 파서가 데이터 설명 만 염두에두고 작성되었으며 구조에서 메서드 정의를 지원하지 않을 수 있기 때문에 메서드를 포함하면 문제가 발생할 수 있습니다.

Wikipedia JSON 항목 은 보안 문제를 언급하면서 JSON에 메서드를 포함하지 않는 좋은 사례입니다.

텍스트의 소스를 절대적으로 신뢰하지 않고 엄격하게 JSON을 준수하지 않는 텍스트를 구문 분석하고 허용해야하는 경우가 아니라면 eval ()을 피하고 대신 JSON.parse () 또는 다른 JSON 특정 구문 분석기를 사용해야합니다. JSON 파서는 JSON 텍스트 만 인식하고 악의적 인 JavaScript를 포함 할 수있는 다른 텍스트는 거부합니다. 네이티브 JSON 지원을 제공하는 브라우저에서 JSON 파서는 eval보다 훨씬 빠릅니다. 네이티브 JSON 지원은 다음 ECMAScript 표준에 포함될 것으로 예상됩니다.


답변

사양 중 하나를 인용 해 보겠습니다-http: //tools.ietf.org/html/rfc7159#section-12

자바 스크립트 객체 표기법 (JSON) 데이터 교환 형식 사양의 상태 :

JSON은 JavaScript의 하위 집합이지만 할당 및 호출을 제외합니다.

JSON의 구문은 JavaScript에서 차용되었으므로 해당 언어의 “eval ()”함수를 사용하여 JSON 텍스트를 구문 분석 할 수 있습니다. 텍스트
가 데이터 선언과 함께 실행 가능한 코드를 포함 할 수 있기 때문에
일반적으로 허용되지 않는 보안 위험을 구성합니다 . JSON 텍스트가 해당
언어의 구문을 따르는 다른 프로그래밍 언어에서 eval ()과 유사한 함수를 사용하는 경우에도 동일한 고려 사항이 적용됩니다 .

따라서 함수가 JSON 표준의 일부가 아닌 상태에 대한 모든 대답은 정확합니다.

공식적인 대답은 : 아니요, JSON 결과에서 함수를 정의하는 것은 유효하지 않습니다!


“코드는 데이터”이고 “데이터는 코드”이므로 대답은 예일 수 있습니다. JSON이 언어 독립적 인 데이터 직렬화 형식으로 사용 되더라도 다른 유형을 통한 “코드”터널링이 작동합니다.

JSON 문자열은 실행을 위해 클라이언트 측 브라우저에 JS 함수를 전달하는 데 사용될 수 있습니다.

[{"data":[["1","2"],["3","4"]],"aFunction":"function(){return \"foo bar\";}"}]

이것은 다음과 같은 질문으로 이어집니다 . ” 문자열로 저장된 JavaScript 코드를 실행 하는 방법 “.

“eval () is evil”플래그를 올리고 그 옆에 “JSON을 통해 기능을 터널링하지 마십시오”플래그를 붙일 준비를하십시오.


답변

내가 아는 한 표준이 아닙니다. http://json.org/간략히 살펴보면이를 확인할 수 있습니다.


답변

아닙니다.

괜찮은 JSON 직렬 변환기를 사용하면 그런 함수를 직렬화 할 수 없습니다. 유효한 OBJECT이지만 유효한 JSON이 아닙니다. 해당 웹 사이트의 의도가 무엇이든 유효한 JSON을 보내지 않습니다.


답변

JSON은 JavaScript 전용 데이터 구조가 아니기 때문에 명시 적으로 함수를 제외합니다 (이름에있는 JS에도 불구하고).


답변

짧은 대답은 아니오입니다 .

JSON은 완전히 언어 독립적이지만 C, C ++, C #, Java, JavaScript, Perl, Python 등을 포함한 C 계열 언어의 프로그래머에게 익숙한 규칙을 사용하는 텍스트 형식입니다. 이러한 속성은 JSON을 이상적인 데이터 교환 언어로 만듭니다.

이유를보십시오.

브라우저와 서버간에 데이터를 교환 할 때 데이터는 텍스트 만 될 수 있습니다.

JSON은 텍스트이며 모든 JavaScript 객체를 JSON으로 변환하고 JSON을 서버로 보낼 수 있습니다.

서버에서받은 모든 JSON을 JavaScript 객체로 변환 할 수도 있습니다.

이렇게하면 복잡한 구문 분석 및 번역없이 데이터를 JavaScript 객체로 사용할 수 있습니다.

하지만 기다려

함수를 저장하는 방법은 여전히 ​​있지만 널리 권장되지는 않지만 여전히 가능합니다.

우리는 string…를 저장할 수 있다고 말했습니다. 그러면 함수를 문자열로 변환하는 것은 어떻습니까?

const data = {func: '()=>"a FUNC"'};

그런 다음을 사용하여 데이터를 문자열 화 JSON.stringify(data)한 다음이를 사용 JSON.parse하여 구문 분석 할 수 있습니다 (이 단계가 필요한 경우).

그리고 eval 을 사용하여 문자열 함수를 실행합니다 (그 전에 eval을 널리 사용하지 않는 것이 좋습니다).

eval(data.func)(); //return "a FUNC"