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 によって悪用される可能性がありますか?

類似の質問:

XSS & をカバーする SO に関する他の投稿がありますがhtmlspecialchars()、「&」文字 (およびそれが許可する可能性のある htmlentities) が XSS にさらされる可能性があるかどうかについての答えが見つかりません。

4

2 に答える 2

1

Sijmen Ruwhofは、私が関連していると思われる興味深い点を次のように述べています。

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

「ENT_QUOTES」オプションは、「a」タグの「href」属性など、特定のタグの属性での JavaScript 評価から保護しません。以下のリンクをクリックすると、指定された 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 をエスケープするために非常に奇妙なコードを使用したことがありますが、これはもっとうまくできるはずです。

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 に答える