2009-10-22 7 views
1

xSLTranform을 사용하여 xml 파일을 dotNet의 html로 변환합니다. xml의 ​​노드 값을 html 태그 내용과 속성으로 변환합니다.XSLT 삽입으로부터 보호

.Net DOM 조작을 사용하여 노드의 InnerText 속성을 임의의 악성 텍스트로 설정하여 XML을 작성합니다. 지금은 악의적으로 제작 된 입력 문자열로 인해 html이 안전하지 않습니다. 일부 자바 스크립트가 사용자로부터 나와서 출력 html의 링크 href 속성으로가는 길을 찾을 수 있다는 의미에서 안전하지 않습니다.

질문은 간단합니다. 내 텍스트를 InnerText 속성에 할당하기 전에 텍스트와 관련시켜야하는 것은 무엇이 있습니까? 나는 InnerXml 대신에 InnerText에 할당하는 것이 텍스트의 필요한 모든 위생 처리를 수행 할 것이라고 생각했지만, 그렇지 않은 것 같습니다.

이 작업을 안전하게 수행하려면 변환에 특별한 특성이 있어야합니까? 내가 알아야 할 모든 .net 특정주의 사항은 무엇입니까?

감사합니다.

답변

0

문제는 xsl 자체에서 발생했는데 disable-output-escaping을 사용했습니다. Tranform 자체가 없으면 필요한 모든 인코딩 작업을 수행합니다.

disable-output-escaping을 사용해야하는 경우 각 요소에 대해 적절한 encodeinf 함수를 사용해야합니다. 태그 내용에 대한 HtmlEncode, 속성 값에 대한 HtmlAttributeEncode 및 html 속성 값에 대한 UrlEncode (예 : href)

0

XML을 XSLT로 변환하기 전에 위생 처리해야합니다. 당신은 당신이 당신의 노드에이 텍스트를 추가 할 때

<script>alert('hi')</script> 

, 당신은 지금

<code>&amp;lt;script&amp;gt;alert('hi')&amp;lt;/script&amp;gt;</code> 

을 얻을 것이다거야,이와

string encoded = HttpUtility.HtmlEncode("<script>alert('hi')</script>"); 
XmlElement node = xml.CreateElement("code"); 
node.InnerText = encoded; 

Console.WriteLine(encoded); 
Console.WriteLine(node.OuterXml); 

: 당신은 아마 뭔가를해야합니다 XSLT를 실행하면이 인코딩 된 HTML이 출력에 문제를 일으키지 않습니다.

+0

내부 텍스트 대신 단순히 노드 값을 설정하면 동일한 결과를 얻지 않겠습니까? 'HtmlEncode()'는 나에게 불필요한 것처럼 보입니다. – Tomalak

+0

@Tomalak, 주요 아이디어는 텍스트를 추가하기 전에 인코딩하는 것입니다 (두 번 인코딩 할 것입니다). 추가하려면, .InnerText (OP가 말한 것처럼) 또는 .Value를 사용할 수 있습니다. –

+0

Hum ... 왜 HtmlEncode에서 한 번, InnerText를 설정 할 때 두 번 인코딩해야합니까? –