重定向甚至发生在错误的网址上

时间:2014-06-04 04:23:01

标签: php redirect

我编写了一个脚本,用于重定向访问我网站的用户

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

这是一个严重的错误,如果避免重定向到错误的网址,任何帮助都会受到高度赞赏

2 个答案:

答案 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
    }
}