0

コード:

<?php
//initializing script, do not modify
session_start();
define('IN_SCRIPT', true); //so that global.php cannot be accessed directly
$_SCRIPTNAME = 'default.php';
include 'global.php';
$db = new MyDB(); //mysql class
if(isset($_GET['action'])) {
    $action = $_GET['action'];
} elseif(isset($_SESSION['user']) && $action == "login") {
    header("Location: {$_SCRIPTNAME}?action=overview");
    exit;
} elseif($action == 'logout') {
    session_unset();
    header("Location: {$_SCRIPTNAME}?action=login");
    exit;
} else {
    header("Location: {$_SCRIPTNAME}?action=login");
    exit;
}

//display proper template for the action defined (if none found, 404)
$template = $db->selectFrom("template", null, array("name" => mysql_real_escape_string($action)));
if(!empty($template['result']['0'])) {
    $template = $template['result']['0'];
    eval("echo \"".$template['html']."\";");
} else {
    $template = $db->selectFrom("template", null, array("name" => "404"));
    $template = $template['result']['0'];
    eval("echo \"".$template['html']."\";");
}
?>

データベースには、 がテンプレートの名前で、がテンプレート自体であるtemplatesという形式のテーブルがいくつかあります。私の知る限り、評価が必要であり、ユーザーがテンプレートに入力するものは何もないため、安全である必要があります。name/htmlnamehtml

サンプル URL は次のようになります。http://localhost/default.php?action=login

私の質問は次のとおりです。

if(isset($_GET['action'])) {
    $action = $_GET['action'];
} elseif(isset($_SESSION['user']) && $action == "login") {
    header("Location: {$_SCRIPTNAME}?action=overview");
    exit;
} elseif($action == 'logout') {
    session_unset();
    header("Location: {$_SCRIPTNAME}?action=login");
    exit;
} else {
    header("Location: {$_SCRIPTNAME}?action=login");
    exit;
}

「ユーザー」セッションが設定されておらず、アクションがログアウトでない場合、default.php?action=login にリダイレクトしませんか? ログインしていないユーザーが「概要」ページにアクセスできないようにしようとしています。

ありがとうございました。

4

1 に答える 1

1

問題はif/elseifブロックにあります。

$action定義をブロックから分離する必要があります。

if(isset($_GET['action'])) {
    $action = $_GET['action'];
}

if(isset($_SESSION['user']) && $action == "login") {
    header("Location: {$_SCRIPTNAME}?action=overview");
    exit;
} elseif($action == 'logout') {
    session_unset();
    header("Location: {$_SCRIPTNAME}?action=login");
    exit;
} else {
    header("Location: {$_SCRIPTNAME}?action=login");
    exit;
}

現在のコードでは、ブロックが実行されif(isset($_GET['action']))、残りのブロックはすべてelseifsであるため、無視されます。

于 2012-06-15T22:05:53.803 に答える