0

PHP と MySQL でセットアップされた Web サイト用のユーザー ログイン システムがあります。私の質問は、「許可」システムを作成するために、現在持っているものを変更できるかどうかでした。つまり、ユーザーには特定のコントロールのみを表示し、管理者には別のコントロールを表示します。私のmysqlテーブルには、列、、、'id'および「a」、「b」を含むENUM「権限」があります。「a」はデフォルトです (管理者ではありません)。以下に、私が試したことを示します。'username''password'

このファイルは " checklogin.php" (スペースを節約するために、すべてのコードは追加しません)

//First I include variables to connect to the database & connect
//Then I define username and password as $_POST from a form on an earlier page
$user=a;
$admin=b;
$sql="SELECT * FROM $tbl_name WHERE username='$myusername' and password='$mypassword' and permissions='$user'";
$sqladmin="SELECT * FROM $tbl_name WHERE username='$myusername' and password='$mypassword' and permissions='$admin'";
$result=mysql_query($sql);
$resultadmin=mysql_query($sqladmin);

$count=mysql_num_rows($result);
$countadmin=mysql_num_rows($resultadmin);

// 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_register("myusername");
 session_register("mypassword"); 
 session_register("user"); 
 header("location:login_success.php");
}
else {
  if($countadmin==1){
   session_register("myusername");
   session_register("mypassword"); 
   session_register("admin"); 
   header("location:login_success.php");
  }
  else {
    if($count==0) {
      if($countadmin==0) {
       echo "Wrong Username or Password";
      }
    }
  }
}

したがって、このファイルでは、ユーザー入力と一致するテーブルの行数と、それが管理者であるかどうかを確認しています。存在する場合は、ユーザー名、パスワード、およびアクセス許可を使用してセッションを登録します。

次に、ファイル " login_success.php"があります

<?php
session_start();
if(!session_is_registered(myusername)){
 header("location:main_login.php");
}
else {
}
?>
<html>
<body>
Login Successful

<?php
if(session_is_registered(admin)){
echo "Welcome Admin!";
}
else {
echo "Not admin...";
}
?>

上記のコードは、セッションが登録されているかどうかを確認し、登録されていない場合はログイン フォームに戻ります。その下には、ユーザーが管理者かどうかを確認するコードのセクションがあります。これのログイン部分は機能しますが、権限を解決できません。

最後に、私の質問は、なぜこれが機能しないのですか? 論理的に正しいようです。長い投稿で申し訳ありません。助けてくれてありがとう。

4

3 に答える 3

2

まず、非推奨を使用していますsession_register,session_is_registered。PHPマニュアルでは、の使用を推奨して$_SESSIONいます。session_is_registered文字列を期待しますが、文字列を渡さないでください-session_is_registered("admin")ではなく、のようなものにする必要がありますsession_is_registered(admin)

また、私はあなたが全体のルーチンを改善できると思います:

  1. データベースから読み取りますSELECT * FROM $tbl_name WHERE username='$myusername'($ myusernameが適切にエスケープされていると仮定します);
  2. レコードが存在しない場合、ユーザー名は無効です
  3. パスワード(またはセキュリティの観点からはるかに優れたハッシュサム)が保存されている値と一致するかどうかを確認します。そうでない場合は、「failed_login_attempts」フィールドをインクリメントすることをお勧めします
  4. 次に、権限を確認します。お客様には複数の役割があると思います。
于 2012-12-08T14:53:36.663 に答える
2

まず、次の行のように、引用符を怠っています。

$user=a;
$admin=b;
if(!session_is_registered(myusername)){

しかし、それが問題かどうかはわかりません。

session_start()次に、セッションを使用する前に呼び出す必要があります。

次のクエリを実行してみませんか?

SELECT * FROM $tbl_name WHERE username='$myusername' and password='$mypassword'

次に、複雑なデュアルクエリの設定をいじる代わりに、返された許可を読み取ることができます。もちろん、ユーザー名が重複していないことを確認する必要がありますが、それは常に当てはまります。

于 2012-12-08T14:56:43.923 に答える
1

次のようなロジックをお勧めします。ユーザーの列の 1 つに「a」が含まれている場合、そのユーザーを別の方法で扱います。つまり、すべてのユーザーに対してまだ 1 つの行のみが表示されます。1回限りのセッション。同じデータ構造。同じセッション。しかし、たとえば、列の「アクセス許可」の値に基づいて、アプリケーションでより多くの「ドア」を開きます。あなたがしなければならないことは、彼のセッションの「許可」が「a」に設定されているかどうか、または彼を管理者として識別するものかどうかを確認することです。

お役に立てれば。マキシム

于 2012-12-08T14:51:50.177 に答える