Каков наилучший способ вырезать теги скрипта из строки URL? - PullRequest
1 голос
/ 27 ноября 2009

Я получаю предупреждение об уязвимости от 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

Я не могу отобразить предупреждение при отправке URL-адреса, но McAfee клянется, что это реальная уязвимость.

Как лучше всего решить эту проблему? Я думал об использовании apache mod_rewrite, чтобы просто переписать все URL, которые содержат тег script. Тем не менее, я не мог понять, как написать выражение для идентификации тега.

Ответы [ 5 ]

1 голос
/ 02 декабря 2009

Оказывается, у меня был следующий код, который отображал URL-адрес внутри страницы.

<?
if($_SERVER['HTTPS']){
?>
<link rel="canonical" href="<? echo HTTP_SERVER.$_SERVER['REQUEST_URI']; ?>" />
<?  
}
?>

Я забыл поместить htmlentities () вокруг request_uri. Следующие исправили это:

<?
if($_SERVER['HTTPS']){
?>
<link rel="canonical" href="<? echo htmlentities(HTTP_SERVER.$_SERVER['REQUEST_URI']); ?>" />
<?  
}
?>
0 голосов
/ 11 декабря 2009
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 _.- & = Конечно, вы можете улучшить эту функцию в соответствии с вашими потребностями.

0 голосов
/ 27 ноября 2009

Вы можете использовать методы UrlEncode и UrlDecode для достижения этой цели. Вы можете погуглить больше об этих пунктах. Вот ссылка, которая поможет вам http://php.net/manual/en/function.urlencode.php

0 голосов
/ 27 ноября 2009

Вместо того, чтобы связываться с фильтрацией попыток атаки, просто убедитесь, что вы всегда правильно экранируете пользовательский ввод в своем HTML. Параметр запроса - пользовательский ввод.

Вам нужно увидеть, как входы распространяются и выходят прямо перед отображением.

Следует помнить, что экранирование отличается в зависимости от контекста, в котором оно отображается. Несколько полезных советов:

  • Появляется внутри элементов HTML: используйте экранирование HTML
  • Появляется в атрибуте элемента HTML: используйте экранирование HTML-атрибута (также можно использовать экранирование HTML, но экранирование только по атрибутам происходит быстрее)
  • Появляется в литерале JavaScript: кодировать с помощью JSON для правильного экранирования
0 голосов
/ 27 ноября 2009

Предложенное решение - исключить тег сценария - является очевидным, наивным и неправильным решением проблем межсайтового скриптинга. Пожалуйста, прочитайте FAQ по XSS от CGI Security (http://www.cgisecurity.com/articles/xss-faq.shtml). Они отлично справляются, объясняя, как работает XS и как его предотвратить, и вам действительно нужно понять это, прежде чем вы сможете правильно исправить это.

...