2009-12-15 5 views
7

HTML을 출력 할 때 텍스트를 텍스트 리터럴이 아닌 제어 문자로 해석 할 수있는 몇 가지 다른 위치가 있습니다. 예를 들어, "일반"텍스트에 (즉, 모든 요소 마크 업 외부입니다) :HTML 이스케이프 컨텍스트는 모두 무엇입니까?

<input value="this is value text"> 

그리고, 나는 HTML 주석 내 생각 : 속성의 값 내에서뿐만 아니라

<div>This is regular text</div> 

:

<!-- This text here might be programmatically generated 
and could, in theory, contain the double-hyphen character 
sequence, which is verboten inside comments --> 

텍스트의 이러한 삼가지 각 순서가 아닌 마크 업으로 간주하여이를 이스케이프해야합니다 방법에 대한 다른 규칙이 있습니다. 그래서 첫 번째 질문은 HTML에서 문자가 마크 업/제어 문자로 해석 될 수있는 다른 컨텍스트가 있습니까? 위의 문맥에는 무엇이 탈출해야하는지에 대한 다른 규칙이 분명히 있습니다.

두 번째 질문은 포함 된 텍스트가 비 마크 업으로 취급되도록 이스케이프해야하는 정규적이고 전역 적으로 안전한 (전체 컨텍스트에 대한) 문자 목록은 무엇입니까? 예를 들어, 속성 값 내에서 의 닫는 구분 기호 문자 (속성 값이 시작된 구분 기호에 따라 '또는 ") 만 제어 의미를 갖기 때문에 이론상으로는 속성 값에서'및 '을 이스케이프해야합니다. 유사하게, "정규"텍스트 내에서만 <과 &은 제어의 의미를가집니다. (나는 모든 HTML 파서가 동일하지 않다는 것을 알고있다. spec-conforming 파서를 달래기 위해 필요한 최소한의 문자 집합이 무엇인지에 주로 관심이있다.)

접두사 : 다음 텍스트는 오류를 던질 것이다. 엄격한 HTML 4.01과 같이

<a href="http://example.com/file.php?x=1&y=2">foo</a> 

구체적으로는 실체 "& Y"가 있어야하는데 무엇을 알고하지 않는 것을 말한다. 그러나 & 뒤에 공백을 넣으면 잘됩니다. 그러나 이것을 즉시 생성하는 경우 &을 사용하면 유효성 검사 오류가 발생하는지 여부를 확인하지 않고 대신 & 속성 값을 모두 이스케이프 처리해야합니다.

+0

을 그것에 대해 자세한 내용을보실 수 있습니다 - HTML 주석 내부; 그들은 단순히 금지됩니다 (주석은 파서에 의해 무시되고 렌더링되지 않으므로 이스케이프 시퀀스는 아무런 도움이되지 않습니다). 어떤 이유에서 -를 포함하는 설명을 포함해야한다면,이를 제거하거나 불쾌감을 줄 일 (U + 2014 EM DASH)으로 대체해야합니다. – dirtside

+0

그래서 간단하게 질문을 넣어. – Kieran

답변

11
<div>This is regular text</div> 

텍스트 콘텐츠 : &을 이스케이프 처리해야합니다. <을 이스케이프 처리해야합니다.

UTF가 아닌 인코딩으로 문서를 만드는 경우 선택한 인코딩 안에 들어 가지 않는 문자는 이스케이프해야합니다.

XHTML (및 일반적으로 XML)에서 시퀀스 ]]>은 텍스트 콘텐츠에 나타나서는 안되기 때문에 해당 시퀀스의 문자 중 하나를 이스케이프 처리해야합니다 (전통적으로 >). 일관성을 유지하기 위해 Canonical XML 사양에서는 텍스트 콘텐츠에서 매번 >을 이스케이프 처리하도록 선택합니다. 이는 수동 작성을 위해 건너 뛸 수 있지만 이스케이프 함수의 나쁜 전략은 아닙니다.

<input value="this is value text"> 

속성 값 : &을 이스케이프 처리해야합니다. 속성 값 구분 기호 " 또는 '은 이스케이프해야합니다. 속성 값 구분 기호가 사용되지 않으면 (그렇게하지 마십시오) 이스케이프가 가능하지 않습니다.

정규 XML은 항상 구분 기호로 "을 선택하고, 따라서 그것을 이스케이프합니다. > 문자는 속성 값에서 이스케이프 할 필요가 없으며 Canonical XML은 이스케이프 처리하지 않습니다. HTML4 사양은 하위 호환성을 위해 > 인코딩을 제안했지만, 이것은 이제까지 기억하지 않는 몇 가지 정말로 고대적이고 무시 무시한 브라우저에만 영향을 미칩니다. 당신은 그것을 무시할 수 있습니다.

XHTML <에서 이스케이프해야합니다. HTML4에서 벗어나지 않고 도망 갈 수는 있지만 좋은 생각은 아닙니다. (그들이 속성 값 정규화 알고리즘에 의해 일반 공간으로 전환하지 않고)

는 문자 참조로 인코딩해야합니다 속성 값의 탭, CR 또는 LF를 포함합니다. 텍스트의 내용과 특성을 모두 들어

값 : XML 1.1에서 XHTML, 당신은 삭제 성격과 C0와 C1 제어 코드, 마이너스 탭, CR, LF 및 NEL있는 제한된 문자를 탈출해야합니다. 총계로 [\x01-\x08\x0B\x0C\x0E-\x1F\x7F-\x84\x86-\x9F]. null 문자는 XML 1.1에서 이스케이프 된 경우조차 포함되지 않을 수 있습니다. XML 1.1 밖에서는 이러한 문자를 전혀 사용할 수 없으며 원하는 이유가 없습니다.

<!-- This text here might be programmatically generated 
and could, in theory, contain the double-hyphen character 
sequence, which is verboten inside comments --> 

예, 가능하지만 탈출 할 수있는 내부 댓글이 없기 때문에 가능한 조치가 없습니다. <!-- &lt; -->을 쓰는 경우 문자 그대로 "앰퍼샌드 문자 l 문자 t- 세미콜론"을 포함하는 주석을 의미하며 DOM 또는 다른 infoset에 그대로 반영됩니다. --이 포함 된 주석은 단순히 직렬화 할 수 없습니다.

<![CDATA[ 부분도 XML의 <?pi의 탈출 사용할 수 없습니다. ]]> 시퀀스를 포함하는 CDATA 섹션을 직렬화하는 전통적인 솔루션은이 시퀀스를 두 개의 CDATA 섹션으로 분할하여 함께 발생하지 않도록하는 것입니다. 단일 CDATA 섹션에서 직렬화 할 수 없으며 데이터에 ?> 인 PI를 serialize 할 수 없습니다. 최종 태그 이름을 따르지 않을 경우,이 초 후, 에러 요소를 종료 것처럼 HTML (되지 XHTML)에 <script><style>

CDATA 요소는 </ (ETAGO) 시퀀스를 포함 할 수 없다. 더 이스케이프는 CDATA 요소 내에 할 수 없기 때문에,이 순서는 (회피와 회피해야 예. document.write('<\/p>');document.write('</p>')을 돌려. (당신은 더 복잡 바보 전략의 많은이 하나를 해결하기 위해 참조 JS-에 unescape를 호출처럼 % 기호로 묶인 문자열, 심지어는 종종 '</scr'+'ipt>'이 여전히 유효하지 않습니다.

다른 규칙이 적용되는 HTML과 XML에서 하나 이상의 컨텍스트가 있으며 DTD에 있습니다 (DOCTYPE 선언의 내부 하위 집합 포함 % 캐릭터가 특별한 능력을 가지고 곳) 하나가 그대로 사용되는 이스케이프 할 필요가있다. 그러나 HTML 문서의 저자로 당신이 그 모든 혼란 근처에 어디 갈 필요가 어느 것이 매우 어렵다.

The following text will throw errors as HTML 4.01 Strict: 

<a href="http://example.com/file.php?x=1&y=2">foo</a> 

예, 전환과 관련하여 오류가 발생했습니다. SGML에서

If you put a space after the &, however, it validates just fine. 

[A-Za-z]# 참조로 분석 시작되지 않습니다 아무것도하지만 규칙. 이것에 의존하는 것은 좋은 생각이 아닙니다. 물론 XHTML에서는 잘 형성되지 않았습니다.)

+0

감사. 실제로 XML에 대해서는 신경 쓰지 않았고 단지 HTML이라고했지만 이미 내가 생각한 것을 확인했습니다. – dirtside

1

위의 문맥에는 무엇을 이스케이프해야하는지에 대한 명확한 규칙이 있습니다.

다른 요소에는 다른 인코딩 규칙이 적용되어 있는지 잘 모르겠습니다. 나열한 모든 예제에는 HTML 인코딩이 필요합니다.

예.

<h1>Fish &amp; Chips</h1> 
<img alt="Awesome picture of Meat Pie &amp; Chips" /> 
<a href="products.aspx?type=1&amp;meal=fish%20%26%20chips&amp;page=1">Fish &amp; Chips</a> 

마지막 예는 (그것을 인코딩해야하는 이유입니다 데이터로 앰퍼샌드 전송) 상황이 털이 얻을 앰퍼샌드도 (&)과이 시점에서 일부 URL 인코딩을 포함한다.

그래서 첫 번째 질문은 HTML에서 문자가 마크 업/제어 문자로 해석 될 수있는 다른 컨텍스트가 있습니까?

제어 문자가 제어 문자로 사용되지 않는 경우 HTML 문서 내 어디에서나 코드를 인코딩해야합니다 (좋은 방법으로). URL을 사용하십시오 URL 인코딩 20 % 등 26 %를 통해 이러한 문자를 통과 할 때 대부분의 시간, 그 HTML 인코딩, & 또는 > 등 Othertimes,

두 번째 질문은

는 무엇인가 포함 된 텍스트가 비 마크 업으로 취급되도록 이스케이프해야하는 정규적이고 전역 적으로 안전한 각 문자 목록 (각 문맥에 대해)? 또한 내가 추측 W3 Schools article이 좋은 지점입니다 -

은 내가 Wikipedia article 그것에 몇 가지 좋은 의견을 가지고 읽기 가치가있을 수도 있음을 말할 것입니다. 대부분의 언어는 텍스트를 안전한 HTML로 준비하는 기능을 내장하고 있으므로 사용자가 선택한 언어를 확인해 보는 것이 좋습니다 (실제로 스크립트 언어를 사용하고 HTML 코드를 직접 코딩하지 않은 경우).

특히, 위키 피 디아에서는 "문자 <,> 및 &은 태그, 속성 값 및 문자 참조를 구분하는 데 사용됩니다. 문자 엔티티 참조 & lt; & gt; &; 및 HTML, XML 및 SGML에 미리 정의되어 & A는 ;,, 문자의 문자 표현 대신 사용할 수 있습니다. "URL 인코딩

, this article seems a good starting point.

닫기 생각을 이미 산책했다했듯이 약간 : 이것은 XML/XHTML의 생각을 제외하고는 법원에 완전히 다른 야심을 가져오고 그 요구 사항은 세계와 개를 인코딩해야한다는 요구 사항입니다. 스크립팅 언어를 사용하고 변수를 작성하는 경우 이를 통해, 내장 함수를 찾는 것이 더 쉬워 지거나 라이브러리를 다운로드하여 라이브러리를 다운로드하는 것이 더 쉬울 것이라는 확신이 있습니다. :)이 답변이 범위가 유효하고 포인트 나 질문을 놓치지 않았 으면 좋겠습니다. 또는 잘못된 음색으로 건너 뜁니다. :)

+0

서로 다른 이스케이프 규칙이 있습니다. 해당 컨텍스트에서 제어 기능이 없기 때문에 <속성 값 내부에서 <를 이스케이프 할 필요는 없지만 <제어 기능이 있으므로 일반 텍스트로 이스케이프해야합니다. 반대로, 일반 텍스트에서 "and '는 제어 기능이 없지만 속성 값 내부에서 수행합니다. 이제는 일반 텍스트에서'및"을 이스케이프 처리하지 않아도되지만 불필요합니다. 따라서 모든 컨텍스트에서 HTML로 모든 제어 문자 목록을 설정하고 항상 모든 컨트롤 문자를 이스케이프 처리하는 것이 가장 좋습니다. – dirtside

+0

동의. 나는 실수로 당신의 추측을 미끄러지는 가능성을 줄이기 위해 모든 시간을 인코딩 할뿐입니다. :) – Amadiere

0

최종 HTML의 유효성에 대해 우려하는 경우 DOM 대신 HTML을 HTML로 작성하는 것이 좋습니다.

타겟팅하는 환경이 무엇인지 알 수 없습니다.

+0

나는 여기 연습에만 관심이 없다. 이론적으로는 탈출을위한 모범 사례는 무엇입니까? – dirtside

+0

또는 오히려, 최상의 * 이론 * ;-) – dirtside

1

웹 브라우저 (HTML, JavaScript 및 스타일 시트 포함)에서 문자를 이스케이프하는 모범 사례를 찾고있는 경우 Michael Coates의 XSS 예방 치트 시트가 아마도 사용자가 원하는 것일 수 있습니다. 여기에는 다양한 해석 컨텍스트에 대한 설명, 각 컨텍스트에서 문자를 인코딩하는 방법을 나타내는 테이블 및 코드 샘플 (ESAPI 사용)이 포함됩니다.

http://www.owasp.org/index.php/XSS_(Cross_Site_Scripting)_Prevention_Cheat_Sheet

0

해당 <script> 다시 <script> 다음 <!-- 다음 조심하십시오, 당신은 아마 너무 이상적으로 스크립트의 문자열 내에서 "\의 u003C"에 <을 탈출해야 할 싶지 않을있는 이중 이스케이프 상태를 입력 (그리고 regexps) 실수로 그것을 트리거하지 않습니다.

당신은 덧붙여, 나는 어떤이는 "이스케이프 시퀀스"가 없다는 것을 깨닫게 여기 http://qbolec-memdump.blogspot.com/2013/11/script-tag-content-madness.html

관련 문제