0

このコードを使用して、PHPで安全なログインページを作成しています。http://girlswhogeek.com/tutorials/2006/creating-a-secure-php-login-pageから入手しました。

<?php
   $username = "user";
   $password = "pass";
   $randomword = "bibblebobblechocolatemousse";

    if (isset($_COOKIE['MyLoginPage'])) {
        if ($_COOKIE['MyLoginPage'] == md5($password.$randomword)) {
?>
    CONTENT HERE
<?php
   exit;
        } else {
         echo "<p>Bad cookie. Clear please clear them out and try to login again.</p>";
         exit;
      }
   }

    if (isset($_GET['p']) && $_GET['p'] == "login") {
      if ($_POST['name'] != $username) {
         echo "<p>Sorry, that username does not match. Use your browser back button to go back and try again.</p>";
         exit;
      } else if ($_POST['pass'] != $password) {
         echo "<p>Sorry, that password does not match. Use your browser back button to go back and try again.</p>";
         exit;
      } else if ($_POST['name'] == $username && $_POST['pass'] == $password) {
         setcookie('MyLoginPage', md5($_POST['pass'].$randomword));
         header("Location: $_SERVER[PHP_SELF]");
      } else {
         echo "<p>Sorry, you could not be logged in at this time. Refresh the page and try again.</p>";
      }
   }
?>

<form action="<?php echo $_SERVER['PHP_SELF']; ?>?p=login" method="post">
    <fieldset>
        <label>
            <input type="text" name="name" id="name" /> Name
        </label>
        <br />
        <label>
            <input type="password" name="pass" id="pass" /> Password
        </label>
        <br />
        <input type="submit" id="submit" value="Login" />
   </fieldset>
</form>

非常にうまく機能しますが、ログイン情報に誤りがあると、空白のページに切り替わり、ログイン情報が間違っているというメッセージがエコーされます。入力を含むページのdivにエコーさせる方法があるかどうか疑問に思いました。関連するエコーメッセージをdiv内に配置しようとしましたが、機能しませんでした。なぜ空白のページになるのかさえわからないことを認めなければなりません。

また、これはそれを行うための最良の方法ですか、それともより安全にする方法がありますか?

支援を提供していただきありがとうございます。

ベニー。

4

3 に答える 3

2

2つの問題があります:

  • コード内のexitはページの実行を停止するため、メッセージを「エコー」した後、ページは停止します
  • divに表示する場合は、メッセージを変数に設定し、divコードに表示します。

これがあなたのコードの例です、少し作り直されました(あなたは調整したいかもしれません):

<?php
$message = NULL;
if (isset($_COOKIE['MyLoginPage'])) {
    if ($_COOKIE['MyLoginPage'] == md5($password . $randomword)) {
        ?>
        CONTENT HERE
        <?php
        exit;
    } else {
        $message = "<p>Bad cookie. Clear please clear them out and try to login again.</p>";
    }
}

if (isset($_GET['p']) && $_GET['p'] == "login") {
    if ($_POST['name'] != $username) {
        $message = "<p>Sorry, that username does not match. Use your browser back button to go back and try again.</p>";
    } else if ($_POST['pass'] != $password) {
        $message = "<p>Sorry, that password does not match. Use your browser back button to go back and try again.</p>";
    } else if ($_POST['name'] == $username && $_POST['pass'] == $password) {
        setcookie('MyLoginPage', md5($_POST['pass'] . $randomword));
        header("Location: $_SERVER[PHP_SELF]");
    } else {
        $message = "<p>Sorry, you could not be logged in at this time. Refresh the page and try again.</p>";
    }
}
?>

<form action="<?php echo $_SERVER['PHP_SELF']; ?>?p=login" method="post">
    <fieldset>
    <label><input type="text" name="name" id="name" /> Name</label>
        <br />
    <label><input type="password" name="pass" id="pass" /> Password</label>
        <br />
    <input type="submit" id="submit" value="Login" />
    </fieldset>
    <?php
    if (isset($message)) {
        echo "<div>" . $message . "</div>";
    }
    ?>
</form>
于 2013-02-28T01:56:48.623 に答える
1

あなたはそれが言うところのタグを含めてあなたのコンテンツ全体を置いていますか?<html>CONTENT HERE

そこに行くべき唯一のものは、ページ全体ではなく、安全なコンテンツです。ボイラープレートHTMLは、<html><head><title>title</title></head><body> ... </body></html>投稿したコードのブロック全体を一周する必要があります。内容はCONTENT HEREログインに成功した場合にのみ表示されるため、安全でないものは表示されません。

これは、私がずっと前に書いたPHPページロッカーの代替実装です。これにより、これがより明確になる可能性があります。</恥知らずなプラグ>

于 2013-02-28T01:59:00.593 に答える
0

ログインに失敗した場合、ログインの結果をエコーし​​ますが、それを含むページは表示されません。すでにサイトデザイン内にログイン失敗ページを表示したい場合は、エラーメッセージとともにログインページに送り返すことをお勧めします。例えば:

header("Location: http://website.com/loginpage.php?failed=1");

次に、ログインページのコードで:

if ($_GET['failed'] == '1') echo "Failed to login. Please try again.";

このように、ログインが失敗した場合、エラーメッセージとともにログインページに送り返されます。

于 2013-02-28T01:54:56.427 に答える