2017-01-04 6 views
3

제 웹 페이지에 제 3 자 코드 (제 3 자 서비스가 제공함)를 삽입했는데 제 HTML 검증이 잘못되었습니다. 문제를 어떻게 해결할 수 있습니까? CDATA가 트릭을하고 있지 않습니다. 이 내 샘플 코드 조각입니다 :HTML 유효성 검사기에서 자바 스크립트 코드를 CDATA가 보호하지 않는 이유는 무엇입니까?

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 
<html> 
<head> 
    <title>test</title> 
    <script type="text/javascript"> 
    /*<![CDATA[*/ 
    document.write('<script src="//sharebutton.net/plugin/sharebutton.php?type=horizontal&u=' + encodeURIComponent(document.location.href) + '"></scr' + 'ipt>'); 
    /*]]>*/ 
    </script> 
</head> 
<body> 

    <p>test</p> 

</body> 
</html> 

그리고 here 당신이 검증의 결과를 확인할 수 있습니다.

+1

왜 코드가 XSS- 주사처럼 보이는지 설명 할 수 있습니까? – Mouser

+1

그 스크립트의 끝은 매우 이상하거나 의심스러운' ''로 보입니까? – Liam

+3

@Liam - ''이 실제 스크립트 요소의 종료 태그로 해석되지 않게합니다. – Quentin

답변

4

<![CDATA[*은 HTML이 아닌 XML의 기능입니다. 이것은 HTML 요소의 script 요소의 텍스트 내용의 일부일뿐입니다.

안전하게 HTML에서 리터럴 자바 스크립트 문자열에서 문자열 </script>를 포함하려면 :

'"><\/script>') 
+0

그것은 llike 매력 작품! 감사. 당신이하고있는 일을 아는 것이 더 쉽습니다 ... 문제를 파악하는 것이 나를 위해 시간을 끌었을 것입니다! – andreaconsole

-4

내가 여기에 잘못 모든 당신의 중첩 된 블록 주석 생각 : 슬래시 탈출. 이 대신에 시도해보십시오 ...

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 
    <html> 
    <head> 
     <title>test</title> 
     <script type="text/javascript"> 
     /*<![CDATA[ 
     document.write('<script src="//sharebutton.net/plugin/sharebutton.php?type=horizontal&u=' + encodeURIComponent(document.location.href) + '"></scr' + 'ipt>'); 
     ]]>*/ 
     </script> 
    </head> 
    <body> 

     <p>test</p> 

    </body> 
    </html> 
+1

주석은 전체 스크립트를 둘러 쌀 수 없습니다. 목표는 HTML 구문 분석기에 CDATA 플래그를 제공하는 것입니다 (XML 파서에서만 작동한다는 점을 제외하고). 전체 스크립트를 주석 처리하면 다른 방식으로 작동하지 않게됩니다. – Quentin