为什么这是XSS攻击以及如何防止这种情况?

Ped*_*ozi 1 php xss

我有这个PHP代码,我的CMS安全自动测试说这是一个XSS攻击.为什么以及如何解决此问题?

$url = "news.php";
if (isset($_GET['id']))
  $url .= "?id=".$_GET["id"];
echo "<a href='{$url}'>News</a>";
Run Code Online (Sandbox Code Playgroud)

h2o*_*ooo 6

它是XSS(跨站点脚本),因为有人可以这样称呼你的东西:

?id='></a><script type='text/javascript'>alert('xss');</script><a href='
Run Code Online (Sandbox Code Playgroud)

基本上将您的代码转换为

<a href='news.php?id='></a><script type='text/javascript'>alert('xss');</script><a href=''>News</a>
Run Code Online (Sandbox Code Playgroud)

现在每当有人访问这个网站时,它就会加载并运行javascript alert('xss');,这可能是一个重定向器或一个cookie窃取者.

正如许多其他人所提到的,你可以通过使用filter_varintval(如果它是一个数字)来解决这个问题.如果你想更高级,你也可以使用正则表达式来匹配你的字符串.

想象一下,你接受az AZ和0-9.这可行:

if (preg_match("/^[0-9a-zA-Z]+$", $_GET["id"])) {
    //whatever
}
Run Code Online (Sandbox Code Playgroud)

filter_input 甚至有一个手动输入正是你想要的(清理你的输入到链接):

<?php
    $search_html = filter_input(INPUT_GET, 'search', FILTER_SANITIZE_SPECIAL_CHARS);
    $search_url = filter_input(INPUT_GET, 'search', FILTER_SANITIZE_ENCODED);
    echo "You have searched for $search_html.\n";
    echo "<a href='?search=$search_url'>Search again.</a>";
?>
Run Code Online (Sandbox Code Playgroud)