2016-06-22 8 views
0

저는 AngularJS 프론트 엔드가있는 .NET 백엔드를 가지고 있습니다. 이 모든 작업은 사용자가 데이터는 JSON으로, 내 백엔드 인코딩되지 않은, 나는 데이터베이스에 입력 된 텍스트를 저장, 전송Json을 백엔드에서 AngularJ로 인코딩해야합니까?

<script>alert('xss');</script> 

로 자신의 이름을 입력 할 때 (아무 자바 스크립트가 실행되지), 텍스트를 보내 , Json과 같이 데이터를 읽을 때 프론트 엔드로 다시 인코딩되지 않습니다.

이 모든 것은 작동하지만 Json을 인코딩하도록 권고 한 보안 코스를 보았습니다.

내 경우에는 Json을 더 잘 인코딩해야합니까?

,"aanvragernaam":"<script>alert('xss');</script>"," 
+0

이것은 자바 스크립트 삽입입니다.문서 ('document.write')에 쓰지 않는 한 괜찮습니다. ** 그러나 어쨌든 JSON을 사용하는 것이 좋습니다. –

+0

그래, 내가 정말 명확하게 지정하지 않았다. 나는 이미 Json을 사용하고있다. (나는 그 질문을 편집했다.) – Michel

+0

실제로 서버에 데이터를 게시하기 전에 입력을 살균 할 수있다. –

답변

1

내용 유형을 application/json으로 설정하는 경우 "알려진"것이 아니기 때문에 this content type will not be sniffed by browsers입니다. 따라서 XSS에 대해 보안되어야합니다.

추가로 인코딩 할 필요가 없습니다.

JSON Hijacking은 GET 요청의 또 다른 취약점이지만, not an issue in modern browsers입니다.

다른 위험은 DOM XSS뿐입니다. DOM에 "있는 그대로"의 값을 쓰지 않는 한 XSS 위험은 없습니다. 그렇다면 브라우저에서 HTML로 인코딩하거나 JQuery 또는 JavaScript를 사용하여 브라우저에서 스크립트로 해석하지 않도록 적절하게 text/textContent을 적절하게 설정해야합니다.

여기 위험은 <script>alert('xss')</script>이 아니므로 동적으로 문서에 추가 할 때 실행하려면 <img src=x onload="alert('xss');" />과 같아야합니다.

0

내가 생각하는 당신이해야에 encodeURI 당신이 데이터베이스에 이름을 저장하는 백엔드 요청을 보내기 전에 (이름) :

은 절약 JSON의 일부 및로드입니다.

그리고 백엔드에서 데이터를받을 때 decodeURI 함수를 사용합니다.

+0

무엇이 해결 될까요? – Michel

1

이름 확인과 같이 입력 확인 및 대괄호 제거는 거의 필요하지 않습니다. 그러나 이는 충분한 보안 제어가 아니며 다른 유형의 데이터 (예 : 설명)를 지원하려는 경우 해당 문자를 지원해야 할 수도 있으므로 제어가 작동하지 않을 수 있습니다.

JSON에서 HTML (스크립트 태그 등)이 발생할 위험은 공격자가 사용자를 속여 브라우저에 HTML로로드하여 표시 할 수 있는지 여부입니다. 이것은 매우 직설적이었습니다. < IE9 그 브라우저는 Content-Type application/json이 무엇인지 알지 못했습니다. 따라서 브라우저는 콘텐츠를 추측하려고합니다. 그러나 이러한 유형의 스니핑은 X-Content-Type-Options: nosniff 헤더를 사용하여 비활성화 할 수 있습니다. 사용자가 브라우저 창에서 직접 JSON을 열려고하면

당신은 파일이 표시되는 대신에 다운로드됩니다,

Content-Disposition: attachment;filename=data.json 
X-Download-Options: NoOpen 

을 추가하여 더 보호를 강화 할 수 있습니다.

IMHO JSON에 인코딩이 필요하지 않습니다.

관련 문제