2013-12-12 3 views
1

XSS 공격을 이해하려고합니다. 나는 htmlspecialchars()를 사용자 입력에서 나온 브라우저에 출력 할 때마다 사용해야한다고 배웠다. 아래의 코드는 잘 작동합니다.XSS 탐지 및 차단, html 형식 허용

내가 이해하지 못하는 것은 $ enrollmentno를 울리기 위해 htmlspecialchars()를 사용할 필요가 있는지 여부입니다.

<?php 


$enrollmentno = (int)$_POST['enrollmentno']; 





echo "<div style='border-radius:45px; border-width: 2px; border-style: dashed; border-color: black;'><center><h4><b>$enrollmentno</b></h4></center></div>"; 


$clink = "http://xyz/$enrollmentno/2013"; 

echo"<iframe src='$clink' width='1500' height='900' frameBorder='0'></iframe>"; 
?> 

내가

$safe = "<div style='border-radius:45px; border-width: 2px; border-style: dashed; border-color: black;'><center><h4><b>$enrollmentno</b></h4></center></div>"; 

echo htmlspecialchars($safe, ENT_QUOTES); 

같은 일을 할 경우 그것은 올바른 HTML 형식을 표시하지 않습니다.

여기 HTMLPurifer를 사용해야하는지 잘 모르겠습니다. HTMLPurifer는 XSS를 방지하면서 HTML 포매팅을 유지합니까?

업데이트

echo "<div style='border-radius:45px; border-width: 2px; border-style: dashed; border-color: black;'><center><h4><b>".htmlspecialchars ($enrollmentno)."</b></h4></center></div>"; 

트릭을합니까!

+1

'$ enrollmentno'에있는 값을 포함하는 변수를 왜 살피지 마십시오 –

+0

감사합니다. 이것은 할 것인가? 'echo "

".htmlspecialchars ($enrollmentno)."

"; ' –

+0

물론입니다! 그 일을 할 것입니다 –

답변

2

HTML 컨텍스트에서 임의의 데이터를 사용할 때마다 htmlspecialchars()을 사용해야합니다. 그 이유는 텍스트 콘텐츠가 HTML로 취급되는 것을 방지하기 때문에 외부 사용자가 오면 악성 콘텐츠가 될 수 있기 때문입니다. 또한 브라우저가 일관되게 처리 할 수있는 유효한 HTML을 생성합니다.

"8> 3"텍스트를 HTML에 표시하려고한다고 가정합니다. 이렇게하려면 내 HTML 코드는 8 &gt; 3이 될 것입니다. >&gt;으로 인코딩되므로 태그의 일부로 잘못 해석되지 않습니다.

이제 HTML 작성 방법에 대한 웹 페이지를 만들고 있다고 가정 해 보겠습니다. 나는 사용자가 다음을보고 싶어 :

<p>This is how to make a paragraph</p> 

나는 실제 단락으로 해석하지만, 텍스트로, 당신은 인코딩해야 할 <p></p>을 원하지 않는 경우 :

&lt;p&gt;This is how to make a paragraph&lt;/p&gt; 

htmlspecialchars() 것을 수행. HTML 컨텍스트에 임의의 텍스트를 안전하게 삽입 할 수 있습니다.

이제 두 번째 예제 :

$safe = "<div style='border-radius:45px; border-width: 2px; border-style: dashed; border-color: black;'><center><h4><b>$enrollmentno</b></h4></center></div>"; 
echo htmlspecialchars($safe, ENT_QUOTES); 

이 당신이 그것을 물어 정확히 무엇을 하는가. 당신은 그것을 약간의 텍스트로 주었고 그것을 인코딩했습니다. HTML로 원한다면 그냥 에코해야합니다.

HTML을 HTML로 표시해야하며 신뢰할 수없는 출처 (예 : 사용자)가 HTML을 표시해야하는 경우 HTMLPurifier와 같은 도구가 필요합니다. 소스를 신뢰하는 경우에는 필요하지 않습니다. htmlspecialchars()을 통해 모든 결과물을 실행해도 마술처럼 안전한 것은 아닙니다. 임의의 텍스트 데이터를 삽입 할 때만 필요합니다. 사용자 이름 및 검토 텍스트 모두 해당 사용자의 입력 무엇이든 포함 할 수 있습니다, 그들은 HTML에서 사용하기 위해 올바르게 인코딩되며,이 경우

echo '<h1>Product Review from ', htmlspecialchars($username), '</h1>'; 
echo htmlspecialchars($reviewText); 

: 여기에 좋은 사용 사례입니다.

+0

완벽! 나는 내 자신의 질문을 해결했다고 생각하지만, 당신의 설명이 정말 분명했다. 사용자가 HTML을 제공해야하고 HTMLPurifier를 사용해야하는 시나리오를 상상할 수 없습니다. HTMLpurifier가 해당 응용 프로그램에서 사용되는 간단한 예제를 제공 할 수 있습니까? –

+0

@Nick_inaw 메시지 보드에서 HTML 형식의 주석을 승인했다고 가정합니다. 그것은 내가 생각하는 가장 보편적 인 유스 케이스이지만, 공통점은 아닙니다. HTMLPurifier는 확실히 보안을 얻고 있다고 생각하는 사람들이 과도하게 사용합니다. 대신 응용 프로그램을 파괴하고 안전성이 떨어지는 경우가 있습니다. 실제로 HTML을 필터링하려는 경우에만 사용해야합니다. – Brad

+0

나는 그것을 지금 완전히 얻는다. 감사. –