2011-03-17 42 views
1

場景:XSS:REQUEST_URI運行htmlspecialchars() - 然後用&替換&足以防止XSS注入?

我想換成:" ' < >&quot; &#039; &lt; &gt;但保留 「&」 字

我正在處理的字符串是一個URL,我希望URL參數由&分隔,而不是&amp;

解決方案示例:

$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或JavaScript),可以在此通過XSS被利用?

類似的問題:

上有SO覆蓋 XSS & htmlspecialchars()其他職位,但我不能 找到解決的答案是否「&」 字符(和ヶ輛它可能 允許)可以將您暴露給XSS。

+0

從用戶數據採集的網址是什麼? – 2011-03-17 02:06:08

+0

在我的情況下,URL來自$ _SERVER [「REQUEST_URI」];基本上任何輸入到瀏覽器地址欄的東西。 – 2011-03-17 02:09:25

回答

1

Sijmen Ruwhof使這個有趣的問題,我覺得是相關的:

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

的「ENT_QUOTES」選項不 防止您的JavaScript在某些標籤的 屬性 評價,如「HREF」屬性的一個標籤的 。當出現以下 鏈接上點擊,給了JavaScript將 得到執行:

<?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 2011-03-17 02:18:35

+0

你是對的HoLyVier。我的回答更多的是關於htmlspecialchars()並不總是足以防止XSS注入......與我的「REQUEST_URI」問題不完全相關;但希望仍然有用的信息給其他人。 – 2011-03-17 03:22:31

0

我曾經用很奇怪的代碼轉義的網址,但我敢打賭,這是可以做的更好,而且這並不包括html專輯,但它只是用於保存到數據庫的網址。

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; 

}