JSON 결과에서 함수를 정의하는 것이 유효한가?
웹 사이트의 JSON 응답 중 일부는 다음과 같은 내용을 포함했습니다(... 컨텍스트를 위해 추가됨).
{..., now:function(){return(new Date).getTime()}, ...}
익명 기능을 JSON에 추가할 수 있습니까?시간'에 액세스할 때마다 다른 값이 반환될 것으로 예상됩니다.
아니요.
JSON은 순전히 데이터 기술 언어입니다.http://www.json.org에서 설명한 바와 같이 이는 "경량 데이터 교환 형식"이며 프로그래밍 언어가 아닙니다.
http://en.wikipedia.org/wiki/JSON,에 따르면 지원되는 '기본 유형'은 다음과 같습니다.
- 숫자(정수, 실수 또는 부동 소수점)
- 문자열(백슬래시 이스케이프가 있는 큰따옴표로 둘러싸인 유니코드)
- 부울(true 및 false)
- 배열(쉼표로 구분되고 대괄호로 묶인 순서대로 정렬된 값)
- 오브젝트(키: 값 쌍의 집합, 콤마 구분 및 중괄호로 묶음)
null
문제는 데이터 정의 언어로서의 JSON이 JavaScript 객체 표기법으로서의 JSON에서 진화했다는 것입니다.Javascript는 JSON에서 eval을 지원하므로 JSON에 JSON 코드를 삽입하는 것은 정당합니다(그 경우).JSON을 사용하여 데이터를 원격으로 전달할 경우 클라이언트와 서버의 상호작용을 잘 모델링하지 않았을 수 있으므로 JSON에 메서드를 넣는 것은 좋지 않은 방법이라고 생각합니다.또한 JSON을 데이터 기술 언어로 사용하고 싶을 때는 데이터 기술만을 염두에 두고 작성된 JSON 파서가 있고 구조 내에서 메서드 정의를 지원하지 않을 수 있기 때문에 메서드를 내장함으로써 문제가 발생할 수 있습니다.
Wikipedia JSON 엔트리는 보안상의 문제를 언급하며 JSON에 메서드를 포함하지 않는 좋은 이유가 됩니다.
텍스트의 소스를 절대적으로 신뢰하고 JSON에 엄밀하게 준거하지 않는 텍스트를 해석 및 받아들일 필요가 없는 한 eval()을 피하고 대신 JSON.parse() 또는 다른 JSON 고유 파서를 사용해야 합니다.JSON 파서는 JSON 텍스트만 인식하고 악의적인 JavaScript를 포함할 수 있는 다른 텍스트를 거부합니다.네이티브 JSON을 지원하는 브라우저에서는 JSON 파서도 eval보다 훨씬 빠릅니다.다음 ECMAScript 표준에는 네이티브 JSON 지원이 포함될 것으로 예상됩니다.
스펙 중 하나를 인용하겠습니다.https://www.rfc-editor.org/rfc/rfc7159#section-12
JavaScript Object Notation(JSON) Data Interchange Format Specification에는 다음과 같이 기술되어 있습니다.
JSON은 JavaScript의 서브셋이지만 할당 및 호출은 제외됩니다.
JSON의 구문은 JavaScript에서 차용되었기 때문에 JSON 텍스트를 해석하기 위해 해당 언어의 "eval()" 함수를 사용할 수 있습니다.텍스트에는
데이터 선언과 함께 실행 가능한 코드가 포함될 수 있으므로 일반적으로 허용되지 않는 보안 위험이 있습니다.동일한 고려사항은 JSON 텍스트가 일치하는 다른 프로그래밍 언어에서 eval()과 같은 함수를 사용하는 경우에도 적용됩니다.
언어 구문
따라서 기능이 JSON 표준의 일부가 아닌 상태에 대한 모든 답변이 정확합니다.
공식 답변: 아니요, JSON 결과에서 함수를 정의하는 것은 유효하지 않습니다!
대답은 "code is data"와 "data is code"이기 때문에 "yes"일 수 있습니다.JSON이 언어에 의존하지 않는 데이터 시리얼라이제이션 포맷으로 사용되고 있는 경우에서도, 다른 타입을 개입시켜 「코드」의 터널링이 기능합니다.
JSON 문자열을 사용하여 JS 함수를 클라이언트 측 브라우저에 전달하여 실행할 수 있습니다.
[{"data":[["1","2"],["3","4"]],"aFunction":"function(){return \"foo bar\";}"}]
그 결과 다음과 같은 질문이 발생합니다."https://stackoverflow.com/questions/939326/execute-javascript-code-stored-as-a-string" 방법
eval() is evil 플래그를 올리고 그 옆에 do not tunnel functions through JSON 플래그를 붙일 준비를 합니다.
내가 아는 한 그것은 표준이 아니다.http://json.org/을 통해 이를 확인할 수 있습니다.
아니, 절대 아니야.
적절한 JSON 시리얼라이저를 사용하면, 그러한 기능을 시리얼화할 수 없습니다.유효한 OBJECT이지만 유효한 JSON이 아닙니다.웹사이트의 의도가 무엇이든 간에 유효한 JSON이 전송되지 않습니다.
JSON은 JavaScript 전용 데이터 구조가 아니기 때문에 함수를 명시적으로 제외합니다(이름에 JS가 있더라도).
간단한 대답은 '아니오'입니다.
JSON은 완전히 언어에 의존하지 않는 텍스트 형식이지만 C, C++, C#, Java, JavaScript, Perl, Python 및 기타 많은 언어 패밀리의 프로그래머들에게 익숙한 규칙을 사용합니다.이러한 속성으로 인해 JSON은 이상적인 데이터 교환 언어가 됩니다.
그 이유를 살펴보세요.
브라우저와 서버 간에 데이터를 교환할 때 데이터는 텍스트로만 할 수 있습니다.
JSON은 텍스트로 JavaScript 객체를 JSON으로 변환하여 서버로 전송할 수 있습니다.
서버로부터 수신한 모든 JSON을 JavaScript 오브젝트로 변환할 수도 있습니다.
이렇게 하면 데이터를 JavaScript 개체로 사용할 수 있으며 복잡한 구문 분석과 번역이 필요하지 않습니다.
근데 잠깐만...
기능을 저장하는 방법은 아직 있습니다.그것은 권장되지 않지만, 그래도 가능합니다.
아까 말씀드렸듯이string그럼 함수를 문자열로 변환하는 것은 어떨까요?
const data = {func: '()=>"a FUNC"'};
그런 다음 다음을 사용하여 데이터를 문자열화할 수 있습니다.JSON.stringify(data)그 후 를 사용하여JSON.parse해석하기 위해 (이 단계가 필요한 경우)...
문자열 함수를 실행하기 위해 eval을 사용합니다(그 전에 eval을 사용하는 것이 권장되지 않습니다).
eval(data.func)(); //return "a FUNC"
Node JS 사용(공통)JS 구문) 이 기능을 사용할 수 있었습니다.원래는 외부 JS 파일 내에 JSON 구조만 있었습니다만, 그 구조는, 실행시에 결정 가능한 메서드를 가지는 클래스가 되고 싶다고 생각하고 있었습니다.
myJ의 '실행자' 선언SON은 필수가 아닙니다.
var myJSON = {
"Hello": "World",
"Executor": ""
}
module.exports = {
init: () => { return { ...myJSON, "Executor": (first, last) => { return first + last } } }
}
JSON의 함수식은 완전히 가능하므로 큰따옴표로 감싸는 것을 잊지 마십시오.다음은 noSQL 데이터베이스 설계에서 가져온 예입니다.
{
"_id": "_design/testdb",
"views": {
"byName": {
"map": "function(doc){if(doc.name){emit(doc.name,doc.code)}}"
}
}
}
eval은 권장되지 않지만 다음과 같이 동작합니다.
<!DOCTYPE html>
<html>
<body>
<h2>Convert a string written in JSON format, into a JavaScript function.</h2>
<p id="demo"></p>
<script>
function test(val){return val + " it's OK;}
var someVar = "yup";
var myObj = { "func": "test(someVar);" };
document.getElementById("demo").innerHTML = eval(myObj.func);
</script>
</body>
</html>
인용문은 생략하고...
var a = {"b":function(){alert('hello world');} };
a.b();
언급URL : https://stackoverflow.com/questions/2001449/is-it-valid-to-define-functions-in-json-results
'programing' 카테고리의 다른 글
| Jersey 서비스에서 JSON 개체를 사용하고 있습니다. (0) | 2023.03.06 |
|---|---|
| JSON 어레이의 foreach, 구문 (0) | 2023.03.06 |
| web.config에서 maxJsonLength의 길이를 무제한으로 설정할 수 있습니까? (0) | 2023.03.06 |
| SpringBoot 주 매니페스트 특성 없음(매븐) (0) | 2023.03.06 |
| javax.servlet.spring 웹 앱의 형식으로 ServletException을 확인할 수 없습니다. (0) | 2023.03.06 |