0

最近、プロジェクトのログインWebページを作成しようとしました。つまり、index.htmlがあります。これは、ユーザーがログインする必要のあるログインページです。クエリをchecklogin.phpに送信します。これは次のとおりです。

<?php
ob_start();
$host="localhost"; // Host name 
$username=""; // Mysql username 
$password=""; // Mysql password 
$db_name="test"; // Database name 
$tbl_name="members"; // Table name 

// Connect to server and select databse.
mysql_connect("wordshare.zxq.net", "754319_guest", "guest")or die("cannot connect"); 
mysql_select_db("wordshare_zxq_users")or die("cannot select DB");

// Define $myusername and $mypassword 
$myusername=$_POST['myusername']; 
$mypassword=$_POST['mypassword']; 

// To protect MySQL injection (more detail about MySQL injection)
$myusername = stripslashes($myusername);
$mypassword = stripslashes($mypassword);
$myusername = mysql_real_escape_string($myusername);
$mypassword = mysql_real_escape_string($mypassword);
$sql="SELECT * FROM members WHERE username='$myusername' and password='$mypassword'";
$result=mysql_query($sql);

// Mysql_num_row is counting table row
$count=mysql_num_rows($result);

// If result matched $myusername and $mypassword, table row must be 1 row
if($count==1){

// Register $myusername, $mypassword and redirect to file "login_success.php"
session_start();
session_register("myusername");
session_register("mypassword"); 
header("location:main.php");
}
else {
    header("location:index.html");
}
ob_end_flush();
?>

次に、メインページでセッションがチェックされ、ログインしていない場合はindex.htmlにリダイレクトされ、コードは次のようになります。

<?php
// Connects to your Database
mysql_connect("wordshare.zxq.net", "754319_guest", "guest")or die("cannot connect");
mysql_select_db("wordshare_zxq_users")or die("cannot select DB");
//checks cookies to make sure they are logged in
session_start();
session_start();
if(!session_is_registered(myusername)){
header("location:index.html");
}
?>

問題は、main.htmlに直接アクセスしても、メインページにリダイレクトされないことです。エコーを使用してセッションが記録されているかどうかを確認しようとしましたが、未定義が返されました。本当に困惑したのは、単語のようなものを印刷しようとしても、「未定義」と返されることです。誰か助けてもらえますか?

4

3 に答える 3

4

コードに多くの問題があります。それをコピーしたところはどこでも、それは非常に悪い例です。暇な時間があるので、私が見ることができるものを強調します。最も深刻なのは最初です。

  • プレーンテキストのパスワードをデータベースに保存します。これは非常に深刻です。誰かがデータベースをハッキングした場合に備えて、ユーザー名とパスワードの情報を簡単に取得できるからです。これは非常によくある間違いですが、非常に悪い間違いです。代わりに、たとえばphpassライブラリを使用してパスワードをハッシュします。そのウェブサイトはこれが何であるかを非常によく説明しています。したがって、学習したい場合は、そのサイトにコードがあるだけでなく、非常に優れた一般的な説明もあります。

  • get_magic_quotes_gpcコードは、それが有効になっていることを想定しています。代わりに、有効になっている場合は動作を拒否する必要があります。マジッククォートが有効になっていると仮定すると、安全なコードを記述できなくなるため、セキュリティの問題になります。

    あなたのコード:

    $mypassword=$_POST['mypassword'];
    
    // To protect MySQL injection (more detail about MySQL injection)
    $myusername = stripslashes($myusername);
    

    提案:

    if (get_magic_quotes_gpc()) {
        throw new UnexpectedValueException('get_magic_quotes_gpc must be off.');
    }
    $mypassword = $_POST['mypassword'];
    

    (もうする必要はありstripslashesません)

  • 他の古い言語機能を使用しています。これは、そのコードをコピーした場所から、最先端のコードを取得していないという単なる症状です。あなたが持っているいくつかの問題:

    • mysql_*関数。代わりにPDOを使用してください。使い方ははるかに簡単で、はるかに強力です。いわゆるプリペアドステートメント(パラメーター化されたクエリとも呼ばれます)を提供することにより、SQLインジェクションを予防的に防止するのに役立ちます。それについて学び、それを使用してください。
    • session_registersession_is_registered機能。これらは、セッション内でグローバル変数を登録するために使用されました。それらは安全ではなく、非推奨です。代わりに、すでにスーパーグローバル$_SESSIONを使用しているように、スーパーグローバルを使用してください。$_POST
  • コードの1つの長いラインナップ。サブルーチンは使用しません。彼らはあなたにとって非常に役立つかもしれませんが。テキストを書くようなプログラミングができるので、独自の関数を書く方法を学びましょう。

例:

<?php
require('my-functions.php');

$location = 'index.html';

if ($user = user_form_submitted() && user_is_valid($user)) {
    user_login_into_session_($user);
    $location = 'main.php';       
}

redirect($location);
?>

ご覧のとおり、これは非常に読みやすいです。次に、その仕事をする関数を定義します。例:

/**
 * redirect request
 *
 * @param string $location
 */
function redirect($location) {
    if (!headers_sent()) {
        header("Location: " . $location);
    }
    printf('Moved <a href="%1$s">here</a>.', htmlspecialchars($location));
}

それはほんの一例です。したがって、栄光のさまざまな詳細がどのように機能するかを考えなくても、すでにプログラミングを開始できます。

関数の使用と抽出、およびPDOの使用に関する関連回答:

于 2012-07-21T10:30:03.797 に答える
1

この行の引用を見逃したと思います:if (!session_is_registered(myusername)) {

そのはず:if( !session_is_registered("myusername")) {

于 2012-07-21T09:56:25.980 に答える
0

2 つのセッション (同じ名前) があります。これは、2 番目のセッションが最初のセッションを上書きすることを意味します。

session_registerマニュアルに記載されているのに、なぜ使用しているのですか

この関数は PHP 5.3.0 で非推奨となり、PHP 5.4.0 で削除されました。

その代わり:

と を入力$_SESSION['myusername'] = $usr;$_SESSION['mypassword'] = $pswd;ます。

main.phpsession_start()の 2 番目を削除します。

if (isset($_SESSION['myusername'])の代わりに入力しsession_is_registered()ます。

于 2012-07-21T10:24:56.493 に答える