2011-03-17 7 views
1

시나리오 : " ' < >&quot; &#039; &lt; &gt;로를하지만 "&"문자을 유지 :XSS : REQUEST_URI를 통해 htmlspecialchars() 실행 - &을 & - XSS 삽입을 방지하기에 충분하도록 바꾸시겠습니까?

나는 대체하고 싶습니다.

처리 할 문자열이 URL이고 &이 아닌 &amp;으로 URL 매개 변수를 구분하고 싶습니다.

예 솔루션 :

$url = "/some/path?a=123&b=456"; // from $_SERVER["REQUEST_URI"]; 
$url = htmlspecialchars($url, ENT_QUOTES, 'ISO-8859-1', true); 
$url = str_replace('&amp;','&',$url); 

질문 :

내 페이지에 $url를 사용하는 경우 (예를 들어, echo $url; HTML 내부 또는 자바 스크립트)이이 XSS에 의해 악용 될 수 있습니까?

비슷한 질문 :

가 SO XSS & htmlspecialchars() 을 포함하는 다른 게시물하지만 내가 주위에 답변을 찾을 수 있는지 여부 "&" 문자 (과를 htmlentities이 을 할 수있다 허용)하면 XSS에 노출 될 수 있습니다.

+0

이 URL은 사용자 데이터로부터 획득되어 있습니까? –

+0

제 경우 URL은 $ _SERVER [ "REQUEST_URI"]에서 가져옵니다. ... 기본적으로 브라우저 주소 표시 줄에 입력 된 모든 것. –

답변

1

Sijmen Ruwhof 내가 관련이 느낌이 흥미로운 점을 만든 :

http://www.php.net/manual/en/function.htmlentities.php#99896

'HREF'는 'A'태그의 속성처럼 자바 스크립트에 대해 특정 태그의 속성에 평가를, 당신을 보호하지 않습니다 'ENT_QUOTES'옵션을 선택합니다.

<?php 
$_GET['a'] = 'javascript:alert(document.cookie)'; 
$href = htmlEntities($_GET['a'], ENT_QUOTES); 
print "<a href='$href'>link</a>"; # results in: <a href='javascript:alert(document.cookie)'>link</a> 
?> 
+2

그의 데이터 소스가 REQUEST_URI이므로 요청이'javascript :'로 시작한다는 것은 불가능합니다. 항상이 벡터를 사용할 수 없게 만드는'/'로 시작합니다. – HoLyVieR

+0

당신 말이 맞습니다. 내 대답은 여기 htmlspecialchars()에 관해서는 XSS 주입을 방지하기에는 항상 충분하지 않다는 것입니다. 내 "REQUEST_URI"질문과 완전히 관련이 없습니다. 하지만 다른 사람들에게 유용한 정보가되기를 바랍니다. –

0

내가 한 번 URL을 탈출 정말 이상한 코드를 사용하지만, 나는 또한 이것이 적용되지 않습니다이 더 잘 수행 할 수 있습니다 내기 : 아래 링크를 클릭하면, 주어진 자바 스크립트 실행 얻을 것이다 html specialchars는 아직 데이터베이스에 URL을 저장하는 데 사용되었습니다.

function escapeUrl(&$url){ 
$matches = parse_url($url); 
    if(!isset($matches["host"])){ 
     Utils_Logging_Logger::getLogger()->log(
      "Unknown host for URL: \"$url\".", 
      Utils_Logging_Logger::TYPE_ERROR 
     ); 
     $matches["host"] = ""; 
    } 
    if(!isset($matches["scheme"])){ 
     Utils_Logging_Logger::getLogger()->log(
      "Sheme (like http://) for URL: \"$url\" was not set.", 
      Utils_Logging_Logger::TYPE_LOG); 
     $url = "http://"; 
    }else{$url = $matches["scheme"]."://";} 
    $url.=$matches["host"]; 
    if(isset($matches["path"])){ 
     $path = rawurldecode($matches["path"]); 
     $url.=$path; 
    } 
    if(isset($matches["query"])){ 
     $query = rawurldecode($matches["query"]); 
     $url.="?".$query; 
    } 
    return $url; 

}