0

この 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=their_email にアクセスすると、$share_php ページにリダイレクトする必要があります。これは機能していません。

ただし、このシナリオが発生した場合: refresh_id.php?email=an-email-that-is-in-in-database スクリプトは $share_page に完全に正常にリダイレクトします。

gbb_viral Cookie の有無にかかわらず、これを試しました。なぜこれが機能しないのかわかりません。自分で探したい場合に備えて、すべてのページが現在ライブでインターネット上にあります。

省略

データベースに存在する電子メールは次のとおりです: acctrafficcop@gmail.com (これをテストしたい人向け)

アップデート

スコープの愚かな間違い。move_on() 関数にグローバル $share_php を追加しただけで、すべてが正常に機能しています。SQL インジェクションについてご指摘いただきありがとうございます。現在、準備済みステートメントに切り替えています。

4

2 に答える 2

3

あなたのmove_on関数では、変数のスコープ$share_phpが原因で変数が存在しません。したがって、リダイレクトは次のようになります 。Location ヘッダーに URL はありません。Location:

変数を関数に渡すか、globalキーワードを使用して使用可能にすることができます。これを試して:

move_on('/redirect_url');

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

実際、どこにもrefresh_id.php変数が呼び出されていないので、空の URL にリダイレクトしています。$share_php

于 2012-07-29T18:42:22.147 に答える
1

また、ブラウザがロケーション ヘッダーを受け入れるようにステータス ヘッダーを設定する必要があります。追加してみる

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

curl を使用すると、デバッグに役立ちます。また、SQL クエリを使用して SQL インジェクションを設定しています。

編集:2番目の回答を読んだ後、リダイレクト機能に場所を渡していないのは正しいです。これも修正する必要があります。

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

このようなユーザーからの入力を決して信用しないでください。代わりに、SQL バインドを使用してください。mysqli ライブラリで行う方法は次のとおりです: http://php.net/manual/en/mysqli-stmt.bind-param.php

于 2012-07-29T18:42:11.430 に答える