XSS:REQUEST_URI运行htmlspecialchars() - 然后替换&与& - 足以防止XSS注射?

时间:2011-03-17 02:00:07

标签: php javascript xss htmlspecialchars

情境:

我想用" ' < > 替换&quot; &#039; &lt; &gt;,但保留“&amp;”字符即可。

我正在处理的字符串是一个网址,我希望网址参数由&分隔,而不是&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(例如HTML或JavaScript中的echo $url;),XSS可以利用它吗?

类似问题:

  

SO上还有其他帖子   XSS&amp; htmlspecialchars()但我不能   找到关于“&amp;”的答案   性格(以及它可能的性质)   allow)可以让你接触到XSS。

     

2 个答案:

答案 0 :(得分:1)

Sijmen Ruwhof 提出了我觉得相关的有趣观点:

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

  

'ENT_QUOTES'选项没有   保护你免受JavaScript   某些标签的评估   属性,如'href'属性   'a'标签。点击时   链接如下,给定的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>
?>

答案 1 :(得分: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;

}