我收到来自Mcafee Secure的漏洞警报,说我的网站上存在XSS漏洞。他们用来制作它的字符串是:
我在提交网址时无法显示提醒,但McAfee发誓这是一个真正的漏洞。
解决这个问题的最佳方法是什么?我正在考虑使用apache mod_rewrite来重写包含脚本标记的所有url。也就是说,我无法弄清楚如何编写表达式来识别标签。
答案 0 :(得分:1)
事实证明,我有以下代码回显页面内的URL。
<?
if($_SERVER['HTTPS']){
?>
<link rel="canonical" href="<? echo HTTP_SERVER.$_SERVER['REQUEST_URI']; ?>" />
<?
}
?>
我忘了在request_uri周围放置htmlentities()。以下修正了它:
<?
if($_SERVER['HTTPS']){
?>
<link rel="canonical" href="<? echo htmlentities(HTTP_SERVER.$_SERVER['REQUEST_URI']); ?>" />
<?
}
?>
答案 1 :(得分:0)
您可以使用UrlEncode和UrlDecode方法来实现这一点。您可以更多地了解这些商品。这是一个可以帮助您http://php.net/manual/en/function.urlencode.php
的链接答案 2 :(得分:0)
请确保始终正确地转义HTML中的用户输入,而不是过滤以过滤攻击尝试。查询参数是用户输入。
您需要查看输入如何传播,并在显示之前进行转义。
要记住的一点是,转义是不同的,具体取决于它显示的上下文。我觉得有用的一些提示:
答案 3 :(得分:0)
function filter_url($url)
{
if (is_array($url))
{
foreach ($url as $key => $value)
{
// recurssion
$url[$key] = filter_url($value);
}
return $url;
}
else
{
// remove everything except for a-ZA-Z0-9_.-&=
$url = preg_replace('/[^a-ZA-Z0-9_\.\-&=]/', '', $url);
return $url;
}
}
现在您可以像这样过滤$ _GET:
$_GET = filter_url($_GET);
除了a-ZA-Z0-9 _.-&amp; =之外,这将消除所有内容 当然,您可以根据自己的需要增强该功能。
答案 4 :(得分:-1)
您提出的解决方案 - 阻止脚本标记 - 是解决跨站点脚本问题的明显,不正确和不正确的解决方案。请阅读CGI Security(http://www.cgisecurity.com/articles/xss-faq.shtml)的XSS FAQ。他们在解释XS如何工作以及如何防止它方面做得非常出色 - 在您正确修复之前,您确实需要了解它。