1

登録ユーザーのみがアクセスできるユーザーと情報を掲載したウェブページを作成しようとしています。未登録のユーザーが見ることができるファイルを制限することは可能ですか?もしそうなら、どのように?index.phpに接続されたMySQLデータベースがすでにあります。これが私がこれまでに持っているものです:

<head></head>
<body>
    <h3>Signup Here:</h3>
        <form method="post" action="userindex.php">

                Please enter user name: <input type="text" name="username" value="" /><br />
                 Please enter password: <input type="password" name="password" value="" />
                <br />
                <input type="submit" value="Submit"/>



        </form>
</body>

<?php
include ("dbroutines.php");

if (isset($_POST['username'])) {


    if ($_POST['username']>'' && $_POST['password']>'' ) {
        $q="insert into users (Name, Password ) values ('".$_POST['username']."', '".$_POST['password']."')";
        echo 'query='.$q;
        $conn=db_connect();
        $result=$conn->query($q);
        echo '<br />xxx'.$conn->error."xxx";
        unset($_POST['username']);
        unset($_POST['password']);
    } else {
        echo 'Please enter both username AND password!';
    }

}

$q="select Name, Password from users";
$conn=db_connect();
$result=$conn->query($q);
echo 'xxx'.$conn->error."xxx";
if ($result){




           echo '<hr />';
            for ($count=0; $row=$result->fetch_row(); ++$count ) {
                echo $count." Name=".$row[0]." password=".$row[1].'<br />';

            }
          echo '<b style="color:red;">there are '.$count.' users in your database!'.'</b><hr />';
}

これから、userindex.phpなどの特定のファイルにアクセスできるユーザーの種類を指定できますか?

4

3 に答える 3

1

はい。次のようなクエリを使用して、指定されたユーザー名とパスワードを使用してデータベースにクエリを実行します。

select * from users where Name = 'john.doe' and Password = 'hunter2' limit 1

行が生成される場合は、ユーザーが存在するため、それらを入力する必要があります。行がない場合、ユーザー名とパスワードの組み合わせは無効であるため、入力しないでください。

これが基本ですが、実際にこれを本番環境に移行する場合は、さらにいくつかの変更を加える必要があります。

  • クエリに入力するデータを適切にエスケープするか、準備されたクエリを使用します。現状では、コードはSQLインジェクション攻撃に対して脆弱です。たとえば、ユーザー名またはパスワードにアポストロフィを使用してアカウントを作成しようとしたとします。あなたのコードは壊れます。これは悪意のある手段にも利用される可能性があるため、実際にパッチを適用する必要があります。

    パッチを適用する最も簡単な方法は、たとえば、を使用して、クエリに入れる前にすべてをエスケープすることですmysql_real_escape_stringmysql_これはおそらく機能しますが、以下に示すように、(関数のファミリー全体が非推奨になっているため)準備されたクエリとPDOを使用する方がさらに良いでしょう。

  • パスワードをハッシュしてソルトし、データベースの侵害(上記の脆弱性にパッチが適用されていない場合はかなり簡単に発生する可能性があります)がすべてのパスワードを明らかにしないようにします。

コードは次のようになります。

// You'd probably want to put these in a separate configuration file.
$db = new PDO('mysql:dbname=test', 'my_mysql_user', 'hunter2');

// Make any errors throw an exception.
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$query = $db->prepare('select * from users where Name = :name limit 1');
$query->bindValue(":name", $_POST['username'], PDO::PARAM_STR);
$row = $query->fetch(PDO::FETCH_ASSOC);

if($row === FALSE) {
    // User not in the database; don't let them in.
}

$calculatedHash = hash("sha512", $row['PasswordSalt'] . $_POST['password']);
if($calculatedHash === $row['PasswordHash']) {
    // Password's right. Let them in.
}else{
    // Password's wrong. Keep them out.
}

さらなる改善は、例えば、塩漬けのSHA-512ではなくbcryptを使用することです。

于 2013-03-27T02:51:33.790 に答える
1

ユーザーの確認は絶対確実な解決策ではないと思います。このユーザーが登録ユーザーであることを覚えておくには、セッションにトークンを保持する必要があります。賢いユーザーはURLを直接入力して機密ページにアクセスできるため、Security.phpという共通のphpページを作成する必要があります。このページに次のコードを配置します。保護する各phpページの上部にこのページを含める必要があります。

         if (!isset($_SESSION['AuthId'])) {
         header('Location:Login.php');
         exit;
         }
于 2013-03-27T03:12:47.077 に答える
1

logginテーブル名「Role」に1つの追加フィールドを入れることができます。

各ログイン時間。マスターユーザーかどうかを確認すると、より多くのアクセスにアクセスできます。

追加ユーザーの場合は、アクセスが制限されます。

あなたは私のポイントを得ましたか?または任意のクエリ?

于 2013-03-27T03:25:02.583 に答える