Programing

JSON 보안 모범 사례?

lottogame 2020. 10. 25. 11:32
반응형

JSON 보안 모범 사례?


의 문제를 연구하는 동안 XML 대 JSON을 , 나는 우연히 이 질문에 . 이제 JSON을 선호하는 이유 중 하나는 Javascript의 변환 용이성, 즉 eval(). 이제 이것은 보안 관점에서 잠재적으로 문제가 될 수 있다는 사실을 즉시 느꼈습니다.

그래서 저는 JSON의 보안 측면과이 블로그 게시물에서 JSON이 사람들이 생각하는 것만 큼 안전하지 않은지 에 대한 연구를 시작 했습니다 . 이 부분은 다음과 같습니다.

업데이트 : JSON을 100 % 올바르게 수행하는 경우 최상위 수준에만 개체가 있습니다. 배열, 문자열, 숫자 등이 모두 래핑됩니다. JavaScript 인터프리터는 객체가 아닌 블록을보고 있다고 생각하기 때문에 JSON 객체는 eval ()에 실패합니다. 이는 이러한 공격으로부터 보호하는 데 큰 도움이되지만 예측할 수없는 URL로 보안 데이터를 보호하는 것이 가장 좋습니다.

좋습니다. 시작하기에 좋은 규칙입니다. 최상위 수준의 JSON 개체는 항상 개체 여야하며 배열, 숫자 또는 문자열이 아니어야합니다. 나에게 좋은 규칙처럼 들린다.

JSON 및 AJAX 관련 보안과 관련하여 수행하거나 피해야 할 다른 사항이 있습니까?

위 인용문의 마지막 부분은 예측할 수없는 URL을 언급합니다. 누구든지 이것에 대한 더 많은 정보를 가지고 있습니까, 특히 PHP에서 어떻게 수행합니까? 저는 PHP보다 Java에 대해 훨씬 더 경험이 많고 Java에서는 간단합니다 (전체 범위의 URL을 단일 서블릿에 매핑 할 수 있다는 점에서). 반면에 제가 수행 한 모든 PHP는 단일 URL을 PHP 스크립트에 매핑했습니다.

또한 보안을 강화하기 위해 예측할 수없는 URL을 정확히 어떻게 사용합니까?


블로그 (CSRF)의 주요 보안 허점은 JSON과 관련이 없습니다. 대신 XML을 사용하는 것은 큰 구멍입니다. 실제로 비동기 호출이 전혀없는 것과 마찬가지로 나쁘다. 일반 링크도 마찬가지로 취약합니다.

사람들이 고유 URL에 대해 이야기 할 때 일반적으로 http://yourbank.com/json-api/your-name/big-long-key-unique-to-you/statement를 의미 하지는 않습니다 . 대신 요청에 대해 다른 것을 고유하게 만드는 것이 더 일반적입니다. 즉, FORM 게시물의 값 또는 URL 매개 변수입니다.

일반적으로 이것은 서버 측의 FORM에 삽입 된 임의의 토큰을 포함하고 요청이있을 때 확인됩니다.

배열 / 객체는 나에게 뉴스입니다.

스크립트 태그 : 공격자는 원격 서버를 가리키는 스크립트 태그를 삽입 할 수 있으며 브라우저는 효과적으로 응답을 eval ()합니다. 그러나 응답을 버리고 JSON이 모두 응답이므로 안전합니다.

이 경우 사이트는 취약하기 위해 JSON을 전혀 사용할 필요가 없습니다. 하지만 공격자가 사이트에 임의의 HTML을 삽입 할 수 있다면 건배입니다.


JSON, 특히 XSRF에 대한 많은 보안 공격이 있습니다.

이 취약점은 웹 서비스가 인증을 위해 쿠키를 사용하고 GET 요청에 대한 응답으로 민감한 데이터가 포함 된 JSON 배열로 응답 할 때 발생합니다.

공격자가 naive-webapp.com 서비스에 로그인 한 사용자를 속여 자신의 사이트 (또는 삽입 된 광고를 통해 제어하는 ​​IFRAME이 포함 된 모든 사이트)를 방문하도록 할 수 <script>있는 경우 SRC가 포함 태그를 삽입 하여 naive-webapp.com, 잠재적으로 사용자의 데이터를 훔칩니다. 이것은 다음 Array과 같은 JavaScript 생성자를 사용하는 JavaScript 특성에 따라 다릅니다 .

 <script>
   // Overload the Array constructor so we can intercept data
   var stolenArrays = [];
   var RealArray = Array;
   Array = function () {
     var arr = RealArray.apply(arguments);
     stolenArrays.push(arr);
     return arr;
   }
 </script>
 <!-- even though the attacker can't access the cookies,
   - he can cause the browser to send them to naive-webapp.com -->
 <script src="//naive-webapp.com/..."></script>
 <script>
   // now stolenArrays contains any data from the parsed JSON
 </script>

EcmaScript 5는 전역 개체 []를 조회하도록 하는 혼란스러운 동작을 수정했으며 Array많은 최신 브라우저가 더 이상이 공격에 취약하지 않습니다.

덧붙여서 Oil은 예측할 수없는 URL에 대해 잘못되었습니다. URL의 암호화 된 보안 임의 식별자는 리소스를 보호하는 좋은 방법입니다. 신원 기반 보안은 오일이 제안한 것처럼 만병 통치약이 아닙니다. ID 개념이 필요하지 않은 URL의 암호화 보안 식별자를 기반으로하는 안전한 분산 애플리케이션 체계의 예는 http://waterken.sourceforge.net/참조 하십시오 .

편집하다:

JSON과 XML을 고려할 때 XML 특정 공격 벡터도 알고 있어야합니다.

XXE , XML 외부 엔티티 공격은 제작 된 XML을 사용하여 방화벽을 통해 파일 시스템 및 네트워크 리소스에 액세스합니다.

<!DOCTYPE root 
[
<!ENTITY foo SYSTEM "file:///c:/winnt/win.ini">
]>
...
<in>&foo;</in>

애플리케이션은 웹 서비스 응답에 입력 (win.ini 파일이 포함 된 매개 변수 "in")을 포함합니다.


it's still best to protect your secure data with un-predictable URLs.

Emphasis mine. What nonsense! It's best to protect your secure data with some proper authentication and possibly some encryption on top of that. JSON exchanges can still use existing authentication techniques (eg sessions through cookies) and SSL.

Relying on somebody not guessing a URL (what they're effectively talking about) will only be a reasonable technique (and even then, only just) when you're using JSON to export data to an anonymous third party (eg a web service). One example is Google's various web service API where anonymous users access Google-data through other websites. They use domain-referrer and API keys to make sure the man-in-the-middle website is allowed to provide Gooogle data.

If you're just using JSON to send private data to and from a direct, known user agent, use some real authentication and encryption. If you're trying to provide a webservice, then it really depends on how "secure" this data is going to be. If it's just public data and you don't mind who can read it, I don't see the point in making a hashy URL.


Edit: to demonstrate what they mean, consider this. Imagine your bank provided a JSON API for getting statements. If I could just type http://yourbank.com/json-api/your-name/statement, you probably wouldn't be best pleased.

They could generate a unique string for your account that was required in any JSON request though, eg: http://yourbank.com/json-api/your-name/big-long-key-unique-to-you/statement

I would have far less chance of being able to guess that. But would you really want that being the only buffer between your genuinely secure data and potential identity thieves? No.

참고URL : https://stackoverflow.com/questions/395592/json-security-best-practices

반응형