情境:
我想用" ' < >
替换" ' < >
,但保留“&amp;”字符即可。
我正在处理的字符串是一个网址,我希望网址参数由&
分隔,而不是&
。
示例解决方案:
$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&amp;
htmlspecialchars()
但我不能 找到关于“&amp;”的答案 性格(以及它可能的性质) allow)可以让你接触到XSS。
答案 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;
}