2
$user = $_COOKIE["username"];
$admin = $db->query("
    SELECT *
        FROM users
        WHERE username = '$user'
        AND admin = '1' -- if 1, user is an administrator
");
if ($admin->rowCount()==1) {
    //stuff related to admin controls/admin specific pages
}

ユーザーが管理者であることを検証する上で、これはどの程度安全ですか? エンド ユーザーは自分の Cookie 情報を編集できますか? 管理者の名前を知っていれば、何らかの方法でアクセスできますか? この場合、$user悪意のある動作を防ぐためにサニタイズする必要がありますか?

4

3 に答える 3

2

ログインの概念とその後に何が起こるかを誤解していると思います。

あなたのコードでは、ログインできるように、最初にどのように Cookie を取得しますか? それは逆です。

最初に、選択したユーザー名とパスワードを取得してデータベースに保存することで、誰かを登録します。後でログインするには、ログインフォームを使用し、入力したユーザー名とパスワードを取得して、データベースに保存されているものと一致することを確認します. これまでのところ、セッションや Cookie は使用していません。

したがって、データベースでユーザー名とパスワードが一致する場合、資格情報が確認されたことになります (このシナリオでは、一意のユーザー名が必要になることに注意してください。デシベル)

ここで、サイト全体でログインしているかどうかを確認したい場合 (もちろん)、資格情報が適切であることを確認するときにセッションを設定する必要があります。これにより、ユーザーに関するデータが保存され、各ページでユーザーがログインしていることを確認および確認できます。これは、ユーザー名などです。

ここで任意の長さに移動し、各ページで IP が引き続き一致することを確認できますセッションを使用します)。

ほとんどのサーバーのデフォルトでは、セッションは実際には Cookie も使用します。これは、サーバーに保存されているセッションのセッション ID です。したがって、ユーザーのセッション データを取得すると、そのユーザーの Cookie から ID が取得され、サーバーに保存されている関連情報にアクセスします。

セッション/Cookie に機密情報を保存しないでください。

パスワードを保存するには、クリプト (md5 や sha ではなく) を使用し、blowfish などのソルト方式を使用します。

于 2013-08-31T00:16:12.370 に答える
1

自分のマシンで Cookie を操作できます。より良いアプローチは、ログインしているユーザーに、データベースと相互参照してユーザーのレベルを取得できるランダムなトークンを割り当てることです。

入力をクエリで使用する前に、常にサニタイズする必要があります。

そのため、ログイン用のテーブルを作成し、アクセス トークンとして使用するランダムな文字列を生成します。php crypt関数を調べて、文字列を生成し、そのトークンとそのトークンだけを Cookie に保存します。ユーザーIDとトークンのみをログインテーブルに保存し、ユーザーテーブルと結合してそこからレベルを取得できます。

ページの使用ごとにトークンを循環させるか、他の誰かがトークンを推測して管理者セッションをハイジャックする可能性を高めることを選択できます。

セキュリティを強化するために、タイムスタンプを保存し、特定の時間枠の後にトークンを無効にすることができます。

于 2013-08-31T00:06:56.273 に答える
0

セキュリティは絶対ゼロ!上記の方法は絶対に使用しないでください。

代わりに、セッションで次の代替案を検討してください

session_start();

// Set this when the user logs in.
// Then it can be read on subsequent requests and the data stored
// on the server and never accepted from the client.
$_SESSION["username"] = "Bob";

$user = $_SESSION["username"];
$admin = $db->query("
    SELECT *
        FROM users
        WHERE username = '$user'
        AND admin = '1' -- if 1, user is an administrator
");
if ($admin->rowCount()==1) {
    //stuff related to admin controls/admin specific pages
}
于 2013-08-31T00:08:04.243 に答える