我想建立一个简单的解引用站点,如anonymous .to
当您访问http://www.mydereferrer.tld/?http://www.sitename.tld时,您应该通过元刷新标签重定向到http://www.sitename.tld。
我有:
<?
if(($pos = strpos($_SERVER['REQUEST_URI'], '?')) !== false) {
$url = trim(substr($_SERVER['REQUEST_URI'], $pos + 1));
}
if (strlen($url) > 50) {
$url_short = substr($url, 0, 48) . "..";
} else {
$url_short = $url;
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<?
if(!empty($url)) {
?>
<meta http-equiv="refresh" content="1; URL=<? echo $url ?>" />
<?
}
?>
<title>.. Redirecting</title>
</head>
<body>
<div id="container">
<?
if (isset($url)) {
?>
<h1>.. Redirecting</h1>
<p><a href="<? echo $url; ?>"><? echo $url_short; ?></a></p>
<?
} else {
?>
<h1>.. No valid URL given</h1>
<?
}
?>
</div>
</body>
</html>
这个工作得很好。但是我应该做哪些安全检查呢?
CBroe所指的是您只包含$url
和$url_short
而不包含任何字符转义。因此,您很容易受到XSS的影响。作为一个简单的例子,假设$url
为
www.google.com" /><body onload=alert('test1')><br style="
然后<meta http-equiv="refresh" content="1; URL=<? echo $url ?>" />
被求值为
<meta http-equiv="refresh" content="1; URL=www.google.com" /><body onload=alert('test1')><br style="" />
OWASP有一个关于如何在页面中嵌入不可信数据的优秀指南。