我有这个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)
它是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_var或intval(如果它是一个数字)来解决这个问题.如果你想更高级,你也可以使用正则表达式来匹配你的字符串.
想象一下,你接受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)
| 归档时间: |
|
| 查看次数: |
670 次 |
| 最近记录: |