【问题标题】:XSS: REQUEST_URI run through htmlspecialchars() - then replacing & with & - enough to prevent XSS injection?XSS:REQUEST_URI 通过 htmlspecialchars() 运行 - 然后用 & 替换 & - 足以防止 XSS 注入?
【发布时间】:2011-07-17 01:59:16
【问题描述】:

场景:

我想用" ' < > 替换:" ' < > 但保留“&”字符

我正在处理的字符串是一个 URL,我希望 URL 参数由 & 分隔,而不是 &

示例解决方案:

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

问题:

如果我在我的页面上使用$url(例如,在 HTML 或 JavaScript 中使用echo $url;),这会被 XSS 利用吗?

类似问题:

还有其他关于 SO 的帖子 XSS & htmlspecialchars() 但我不能 围绕“&”是否找到答案 字符(以及它可能的 htmlentities allow) 可以将您暴露给 XSS。

【问题讨论】:

  • URL是从用户数据中获取的吗?
  • 在我的例子中,URL 取自 $_SERVER["REQUEST_URI"]; ...基本上是在浏览器地址栏中输入的任何内容。

标签: php javascript xss htmlspecialchars


【解决方案1】:

我曾经使用非常奇怪的代码来转义 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;

}

【讨论】:

    【解决方案2】:

    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>
    ?>
    

    【讨论】:

    • 由于他的数据来源是REQUEST_URI,所以不可能有javascript:开头的请求。它总是以/ 开头,这使得该向量无法使用。
    • 你是对的。我在这里的回答更多的是关于 htmlspecialchars() 并不总是足以防止 XSS 注入......与我的“REQUEST_URI”问题并不完全相关;但希望对其他人仍然有用。
    猜你喜欢
    • 2011-01-08
    • 1970-01-01
    • 1970-01-01
    • 2019-06-03
    • 1970-01-01
    • 1970-01-01
    • 2016-03-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多