3

index.php

<?php
if( $_SESSION['auth'] != 1 ) {
    require( 'login.php' );
}
else {
    echo "hello";
}
?>

login.php

<?php
$name = $_POST['name'];
$pass = $_POST['pass'];

if( isset($name) || isset($pass) )
{
    if( empty($name) ) {
        die ("ERROR: Please enter username!");
    }
    if( empty($pass) ) {
        die ("ERROR: Please enter password!");
    }


    if( $name == "<some name>" && $pass == "<some password>" )
    {
        // Authentication successful - Set session
        session_start();
        $_SESSION['auth'] = 1;
        setcookie("username", $_POST['name'], time()+(84600*30));
        echo "Access granted!";
    }
    else {
        echo "ERROR: Incorrect username or password!";
    }
}


// If no submission, display login form
else {
?>
    <html>
    <head></head>
    <body>
    <center>
    <form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
    Username: <input type="text" name="name" value="<?php echo $_COOKIE['username']; ?>">
    <p />
    Password: <input type="password" name="pass">
    <p />
    <input type="submit" name="submit" value="Log In">
    </center>
    </body>
    </html>
<?php
}
?>

ですから、私はまだPHPを学んでいるので、今理解しようとしていることがいくつかあります。

  • index.phpをリロードして、「hello」と表示されるようにするにはどうすればよいですか?
  • 認証が成功したときにlogin.phpを自動ロードしてindex.phpを取得し、その「こんにちは」に到達できるようにするにはどうすればよいですか?
  • 後で、Cookieを使用してユーザーが送信したログインデータを保存する(つまり、セッションを復元するためにフォームに入力し直す必要がない)場合、潜在的な問題が発生しますか?

感謝します。

4

6 に答える 6

5

1、index.phpにsession_start()がありません。これを追加すると、「Helloworld」が表示されるはずです。

2、行を「アクセス許可」に置き換えます。リダイレクトあり:

header('Location: index.php');
exit;

3、クレデンシャルは確実にCookieに保存できますが、パスワードは常にハッシュしてソルトする必要があります。これは、パスワードハッシュに関する優れた記事です。

于 2010-12-23T07:10:49.817 に答える
4

より良い方法: index.php でセッション変数を確認し、設定されていない場合はリダイレクトします。このようなもの

session_start();
if (!isset($_SESSION['auth']) || $_SESSION['auth'] != 1) {
   header('Location: login.php');
   exit();
}
echo 'Hello'; 

login.php では、認証が成功した後、index.php にリダイレクトし、そこでエコーを行います。

session_start();
if( $name == "<some name>" && $pass == "<some password>" )
{
// Authentication successful - Set session
   $_SESSION['auth'] = 1;
   setcookie("username", $_POST['name'], time()+(84600*30));
   header('Location: index.php');
   exit();
}
else {
  echo "ERROR: Incorrect username or password!";
}

session_start() は、コンテンツがブラウザにエコーされる前に来る必要があります。

于 2010-12-23T07:13:45.340 に答える
2

あなたがすべき:

  1. 常にsession_start()できるだけ早く呼び出すようにしてください - 「Cookie ベースのセッションを使用するsession_start()には、ブラウザーに何かを出力する前に呼び出す必要があります。」

  2. 設定されているか確認$_POST['name']してから行って$name = $_POST['name'];ください。できるよ:

    $name = isset($_POST['name']) ? $_POST['name'] : '';
    
  3. Cookie が保持するデータのみを保持し、エンド ユーザーが置き換えたり悪用したりする可能性のあるデータを保持しないように、username直接保存します。$_SESSIONPHPSESSID

    $_SESSION['user'] = 'John';
    
  4. ユーザーをリダイレクトしてindex.php、セッションを変更した直後の結果を確認してください。

    header('Location: index.php');
    exit;
    

したがって、これは次のようになります。

<?php
session_start();
if (empty($_SESSION['user'])) {

    $name = isset($_POST['name']) ? $_POST['name'] : '';
    $pass = isset($_POST['pass']) ? $_POST['pass'] : '';

    if ($name != '' || $pass != '')
    {
        if ($name === '')
            die("ERROR: Please enter the username!");

        if ($pass === '')
            die("ERROR: Please enter the password!");

        if ($name == "test" && $pass == "test") {

            // authentication successful, save username in session:
            $_SESSION['user'] = 'John';

            // redirect to index.php to welcome the logged in user:
            header('Location: index.php');
            exit;
        }
        else {
            die("ERROR: Incorrect username or password!");
        }
    }

    // no submitted data, display form:
    ?>
        <html>
        <head></head>
        <body>
            <center>
            <form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
            Username: <input type="text" name="name" value=""><br>
            Password: <input type="password" name="pass"><br>
            <input type="submit" value="Log In">
            </form>
            </center>
        </body>
        </html>
    <?php
}
else {
    // info about current user is stored in session, welcome this user:
    echo "hello " . $_SESSION['user'];
}
?>
于 2014-07-19T03:27:48.210 に答える
1

index.php をリロードして「hello」と表示できるようにするにはどうすればよいですか?

を削除するelseと、常に「hello」が表示されます。

if($_SESSION['auth'] != 1) {
    require('login.php');
}
// Either way always print.
echo "hello";

認証が成功したときに login.php を自動ロードして index.php を取得し、その「こんにちは」を取得するにはどうすればよいですか?

echo "Access granted!";と置き換えますheader('Location:index.php');

後で、Cookie を使用してユーザーが送信したログイン データを保存すると (セッションを復元するためにフォームを再入力する必要がなくなります)、潜在的な問題が発生しますか?

ユーザー名のみを自動入力する方法としてこれを使用している限り。ユーザーは毎回パスワードを入力する必要があります。そうしないと、ユーザーは自分のユーザー名 Cookie を「admin」または他のユーザーに設定できます。

于 2010-12-23T07:12:35.493 に答える
1

これを使用して index.php にリダイレクトします (#1 と #2 に答えてくれることを願っています)

if( $name == "<some name>" && $pass == "<some password>" )
{
    // Authentication successful - Set session
    session_start();
    $_SESSION['auth'] = 1;
    setcookie("username", $_POST['name'], time()+(84600*30));
    //echo "Access granted!";
    header("Location: index.php");
    die('');
}

ユーザー名を直接保存するために Cookie を使用しています。それは素晴らしい選択肢ではありません。ユーザーが他のユーザー名を読み取るために Cookie を変更するとどうなりますか? 代わりに次のように使用$_SESSION['..'] します。

$_SESSION['user']=$_POST['name'];

その後、

if (isset($_SESSION['user']))
    echo "Hello, " . $_SESSION['user'];
于 2010-12-23T07:13:03.787 に答える