我编写了一个脚本,用于重定向访问我网站的用户
http://localhost/ghi/red.php?go=http://www.google.com
当像我上面的theres URL我的脚本获取go变量值并检查它是否在我的数据库表上作为可信站点时,如果是,它会重定向到该站点。在这种情况下,即使对于子域也应该进行重定向
作为示例,即使“go”变量具有类似www.google.com/images的值,如果www.google.com位于受信任的网站表中,也应该进行重定向。 我通过使用PHP INDEX OF函数来实现,如下所示
$pos = strrpos($trusted_sites, $go_value);
这很好,但是我偶然遇到了一个问题...
即使go变量的值类似于www.google.comqwsdad,它仍会将用户重定向到www.google.com
这是一个严重的错误,如果避免重定向到错误的网址,任何帮助都会受到高度赞赏
答案 0 :(得分:1)
“正确”的方式是给我们一系列网站(甚至数据库),然后使用in_array。
<?php
$trusted_sites=array("http://www.google.com","http://www.yahoo.com");
if (in_array("http://www.google.com",$trusted_sites)) {
print "Ok\n";
} else {
print "Bad site\n";
}
我不时使用的一种快速作弊方式是确保你有一个分隔符(例如空格)作为$trusted_sites
的第一个和最后一个字符,然后将分隔符添加到$go_value
。
<?php
$trusted_sites="http://www.google.com http://www.yahoo.com";
$go="http://www.google.com";
if (strpos(" $trusted_sites "," $go ")===False) {
print "Bad site\n";
} else {
print "Ok\n";
}
在这个例子中,我在strpos()
内部的两个变量的开头和结尾添加了分隔符(空格);在$trusted_sites
的情况下,我可以将它们放在初始声明中。
答案 1 :(得分:1)
如果您想从网站白名单中进行此类重定向。首先在数组中构建whilelist。然后,您可以使用in_array()
中的$_GET['go']
对其进行比较。考虑这个例子:
// sample: http://localhost/ghi/red.php?go=http://www.google.com/images
if(isset($_GET['go'])) {
$go = $_GET['go'];
$url = parse_url($go);
$go = $url['host'];
$scheme = $url['scheme'];
$certified_sites = array('www.imdb.com', 'www.tomshardware.com', 'www.stackoverflow.com', 'www.tizag.com', 'www.google.com');
if(in_array($go, $certified_sites)) {
header("Location: $scheme://$go");
exit;
} else {
// i will not redirect
}
}