从URL字符串中删除脚本标记的最佳方法是什么?

时间:2009-11-27 06:11:24

标签: mod-rewrite xss

我收到来自Mcafee Secure的漏洞警报,说我的网站上存在XSS漏洞。他们用来制作它的字符串是:

https://www.mywebsite.com/%3E%22%3E%3Cscript%3Ealert%28123%29%3C/script%3E%3C%22/www.mywebsite.com/my-product.html?ref=443%2Fanother_page_on_my_site.php

我在提交网址时无法显示提醒,但McAfee发誓这是一个真正的漏洞。

解决这个问题的最佳方法是什么?我正在考虑使用apache mod_rewrite来重写包含脚本标记的所有url。也就是说,我无法弄清楚如何编写表达式来识别标签。

5 个答案:

答案 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中的用户输入,而不是过滤以过滤攻击尝试。查询参数是用户输入。

您需要查看输入如何传播,并在显示之前进行转义。

要记住的一点是,转义是不同的,具体取决于它显示的上下文。我觉得有用的一些提示:

  • 出现在HTML元素中:使用HTML转义
  • 出现在HTML元素属性中:使用HTML属性转义(也可以使用HTML转义,但仅属性转义更快)
  • 出现在JavaScript文字中:使用JSON编码以正确转义

答案 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如何工作以及如何防止它方面做得非常出色 - 在您正确修复之前,您确实需要了解它。

相关问题