PHP脚本不通过标头重定向

时间:2012-07-29 18:37:21

标签: php mysql cookies

我正在寻找代码中的某种错误,导致此PHP页面无法重定向。我正在寻找是否有人可能知道这个问题的原因(它可能与cookie有关)。

inc_vars.php:

<?php
//some of the variables have been omitted.
$pid = 'gbb';
$dbtable ='';
$dbname = '';
$dbuser = '';
$dbpass = '';

$connect = mysql_connect('localhost', $dbuser, $dbpass);

if(!$connect){
    header('Location: omitted');
    die();
}

mysql_select_db ($dbname, $connect);

$webroot = 'omitted';

$share_page = $webroot . '/share-the-training';

$gift = $webroot . '/free-video?setuser=1199';

$bonus_content = $webroot . '/awesome-bonus';

$share_php = $webroot . '/share.php';

?>

refresh_id.php:

<?php

include_once('inc_vars.php');

$results = mysql_query("SELECT id FROM " . $dbtable . " WHERE email='" . $_GET['email'] . "'");


if(!$results || mysql_num_rows($results)==0){
    header('Location: ' . $share_page . '?errorcode=1');
    die();
}

$res_arr = mysql_fetch_assoc ($results);

setcookie($pid . "_viral", (string)$res_arr['id'], time() + 3600 * 365);

move_on();

function move_on(){
    header ('Location: ' . $share_php);
    die();
}

?>

当此人访问refresh_id.php?email =他们的电子邮件时,他们应该重定向到$ share_php页面。这不起作用。

但是,如果出现这种情况:refresh_id.php?email = an-email-that-is-not-in-database,那么脚本重定向到$ share_page绝对没问题。

我已尝试使用和不使用gbb_viral cookie。我不确定为什么这不起作用。所有页面都是现场和互联网,以防您想要自己寻找。

省略

数据库中存在的电子邮件如下:acctrafficcop@gmail.com(对于那些想要测试此内容的人)

更新

范围的愚蠢错误。我只是在move_on()函数中添加了全局$ share_php,现在一切正常。谢谢大家关于SQL注入的问题,我现在正在切换到准备好的语句。

2 个答案:

答案 0 :(得分:3)

move_on函数中,由于variable scope,变量$share_php不存在。因此,您的重定向如下所示:Location:。位置标题中没有URL。

您可以将变量传递给函数,或使用global关键字使其可用。试试这个:

move_on('/redirect_url');

function move_on($url){
    header ('Location: ' . $url);
    die();
}

事实上,在refresh_id.php中我没有看到任何名为$share_php的变量,因此您将重定向到空URL。

答案 1 :(得分:1)

您还需要为浏览器设置状态标头以支持位置标头。尝试添加

header('HTTP/1.1 303 See Other');

使用curl将帮助您进行调试。此外,您正在使用SQL查询为SQL注入做好准备。

编辑:阅读第二个答案后,您没有将位置传递到重定向功能是正确的。这也应该修复。

$results = mysql_query("SELECT id FROM " . $dbtable . " WHERE email='" . $_GET['email'] . "'");

永远不要相信像这样的用户的输入。相反,使用SQL绑定。以下是使用mysqli库的方法:http://php.net/manual/en/mysqli-stmt.bind-param.php