1

设想:

我想替换:" ' < >使用&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()但我找不到关于“&”字符(以及它可能允许的htmlentities)是否可以让您暴露于XSS的答案。

4

2 回答 2

1

Sijmen Ruhhof提出了一个有趣的观点,我认为这很重要:

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

'ENT_QUOTES' 选项不能保护您免受某些标记属性中的 javascript 评估,例如 'a' 标记的 '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>
?>
于 2011-03-17T02:07:41.250 回答
0

我曾经使用非常奇怪的代码来转义 url,但我敢打赌这可以做得更好,而且这还没有涵盖 html 特殊字符,它只是用于将 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;

}

于 2011-03-17T02:16:32.843 回答