2012-10-19 2 views
3

이 코드는 더 이상 필요하지 않게 변경되었지만 여전히 호기심을 묻습니다.XSS-safe JsonResult as string

많은 검색을 한 후에 나는 this question과 그 외 몇몇 사용자를 찾았습니다. 나는 JsonResult에 의해 반환 될 JSON을 가져 와서 뷰에서 사용하는 방법을 찾고 있었다. 그 대답과 다른 문제는 그들이 안전하지 않은 것처럼 보입니다. , Json.Encode가 더 이상 존재하지 않는 것 모두의

@Html.Raw(Json.Encode(Model)) 

첫째 : 내가 찾은 일부 소스는 다음과 같이 제안했다. 둘째, Raw를 사용하면 JSON 구문이 인코딩되지 않을뿐만 아니라 모델 내용도 손상되지 않습니다. 사용자가 자신의 정보에 <script> 태그를 입력하면 해당 정보가 침입하여 실행됩니다. Raw를 사용하지 않으면 뷰 작성자가 JSON을 이스케이프 처리합니다.

내가 원했던 이유는 템플릿을 사용하는 jQuery 페이지가 있기 때문이며, 첫 번째로드에서는보기 출력에 스크립트를 실행하여 템플릿을 계속 사용하려고했습니다.

답변

0

모든 JSON 출력을 HMTL에서 안전하게 사용할 수있는 것은 아닙니다. 실제로 Json.NET (기본 설정)의 기본 구성을 사용하면 XSS 취약점이 발생할 수 있습니다. 어쨌든

, 같은 약 없는 광고이 있지만, Json.Encode<script> 맥락에서 구조 @Html.Raw(Json.Encode(obj))에서 사용할 안전입니다. (결과는 하나의 따옴표를 사용 특성에서도 안전한 "원시"아니지만 따옴표 또는 따옴표를 사용 하나.) Json.Encode<에 \ U-인코딩 >, &가 적용되기 때문에

이이고 ' 문자를 JSON 문자열 리터럴 (ASCII 제어 문자를 이스케이프 처리하므로 XML도 잘 처리됩니다).

{"hello":"\u0000\"\b\r\t\u003c\u003e\u0026\u0027"} 

Json.Encode 이후에있어서, 예를 들어

Json.Encode(new { hello = "\0\"\b\r\t<>&'" }) 

결과를 여전히 포함하는 어셈블리 (System.Web.Helpers) 또는 공간이 제대로 사용하지 않은 가능성이 존재한다.

나는이 질문이 3 년이 지났음을 알고 있습니다 ~하지만이 질문은 짧은 검색 후에 찾을 수있는 가장 좋은 질문 이었기 때문에 나는 손을 흔드거나 무시하는 다른 많은 출처로 스스로를 찾아야했습니다. 전적으로 문제가 .. 그래, 네크로맨서 배지가 필요해.