1

一度に 1 つのセッションのみを検証するのを手伝ってください。現在、同じユーザー名で任意の数のセッションにログインできる以下のスクリプトを参照してください。

セッションを検証するタイミングと場所がわかりません。ユーザー名のセッションを検証できる数行だけを追加するのに役立ちます。

<?php // accesscontrol.php
include_once 'common.php';
include_once 'db.php';

session_start();

$uid = isset($_POST['uid']) ? $_POST['uid'] : $_SESSION['uid'];
$pwd = isset($_POST['pwd']) ? $_POST['pwd'] : $_SESSION['pwd'];

if(!isset($uid)) {
  ?>
  <!DOCTYPE html PUBLIC "-//W3C/DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  <html xmlns="http://www.w3.org/1999/xhtml">
  <head>
<title>Login</title>
<meta http-equiv="Content-Type"
  content="text/html; charset=iso-8859-1" />
<head>
<style type="text/css">
<!--
.style1 {
    font-size: 16px;
font-family: Verdana, Arial, Helvetica, sans-serif;
}
.style3 {
    font-size: 12px;
    font-family: Verdana, Arial, Helvetica, sans-serif;
}

body {
background-color: #D7F0FF;
margin-left: 0px;
margin-top: 0px;
margin-right: 0px;
margin-bottom: 0px;
}

-->
</style>

  </head>
<body>
  <h1 class="style1"> <br><br>Amogh Site - Login Required </h1>
  <span class="style3"><br>
  You <strong>must login to access this area </strong>of the site. <br>
  <br>
  If you are not a registered user, please contact your Admin
     to sign up for instant access!</span>
  <p><form method="post" action="<?=$_SERVER['PHP_SELF']?>">

<span class="style3">User ID:&nbsp;&nbsp;&nbsp;&nbsp;    
<input type="text" name="uid" size="12" />
<br>
<br />
Password:</span>    
<input type="password" name="pwd" SIZE="12" />
<br>
<br />
<input type="submit" value="Login" />
  </form></p>

</body>
  </html>
  <?php
  exit;
}

$_SESSION['uid'] = $uid;
$_SESSION['pwd'] = $pwd;

dbConnect("hitek_svga3");
$sql = "SELECT * FROM user WHERE
    userid = '$uid' AND password = '$pwd'";
$result = mysql_query($sql);
if (!$result) {
error('A database error occurred while checking your '.
    'login details.\\nIf this error persists, please '.
    'contact you@example.com.');
}

if (mysql_num_rows($result) == 0) {
  unset($_SESSION['uid']);
  unset($_SESSION['pwd']);
  ?>

  <!DOCTYPE html PUBLIC "-//W3C/DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  <html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <title> Access Denied </title>
    <meta http-equiv="Content-Type"
      content="text/html; charset=iso-8859-1" />
    <style type="text/css">
<!--
.style1 {
    font-size: 16px;
    font-family: Verdana, Arial, Helvetica, sans-serif;
}
.style3 {
font-size: 12px;
font-family: Verdana, Arial, Helvetica, sans-serif;
}
-->
</style>  

  </head>
  <body>
  <br/>
  <br/>

  <h1 class="style1"> Access Denied </h1>
  <p class="style3">Your user ID or password is incorrect, or you are not a
 registered user on this site. To try logging in again, click
 <a href="<?=$_SERVER['PHP_SELF']?>">here</a>. To access, please contact our Admin     !</a>.</p>
  </body>
  </html>
  <?php
  exit;
}

$username = mysql_result($result,0,'fullname');
$_SESSION['user'] = mysql_result($result,0,'userid');
$_SESSION['email'] = mysql_result($result,0,'email');
$_SESSION['notes'] = mysql_result($result,0,'notes');

?>
4

2 に答える 2

0

まず、なぜパスワードをセッション変数に保存するのですか?

次に、コードは、POST変数「uid」と「pwd」が存在しない場合にセッション変数「uid」と「pwd」が存在することを前提としているため、スクリプトを許可する前に、どちらかまたは存在することを確認する必要があります。続ける。これは、session_start()関数の後に実行する必要があります。

<?php // accesscontrol.php
include_once 'common.php';
include_once 'db.php';

session_start();

if(
      (!isset($_SESSION['uid']) || !isset($_SESSION['pwd'])) &&
      (!isset($_POST['uid']) || !isset($_POST['pwd']))
{
     //Redirect or throw exception or whatever
}

$uid = isset($_POST['uid']) ? $_POST['uid'] : $_SESSION['uid'];
$pwd = isset($_POST['pwd']) ? $_POST['pwd'] : $_SESSION['pwd'];
于 2012-12-02T11:15:57.673 に答える
0

貴方はするべきではない:

  • データベースに平文のパスワードを保持する
  • mysql拡張機能の使用
  • フレームワークなしで 2012 年に開発

問題のポイントは、PHP はどのユーザーからのリクエストかをどのように判断するかということです。前回チェックしたときは、GETパラメーターとして送信されたトークン、またはHTTPリクエストヘッダーセクションのCookieを使用して使用されていました(と呼ばれていたと思いますPHPSESSID)。

明らかに、誰もセッションを盗まないことを保証するために、ID トークンは安全なチャネルを介して交換する必要があります。つまり、ユーザーがログインしたら、セッション ID を生成し、ポート 80 でプレーン HTTP ソケットを無効にする必要があります。ログインしたユーザーを必要とするスクリプトは保持する必要があります。ポート 443 で HTTPS のみを許可する別のホスト。

セッション ID はログイン スクリプトから割り当てられ、userテーブルの列に保持されます。ところで、通常のアプリケーションは別のテーブルを使用してセッションをユーザーに関連付けますが、ユーザーごとに 1 つのクライアントが必要なため、userテーブルの列で十分です。

そのため、リクエストにセッション トークンが含まれている場合、トークンがまだ有効であるかどうかを承認ロジックがユーザー テーブルでチェックします。トークンを使用してユーザーを認証する必要があるため、リクエストにトークンが含まれていない場合、またはトークンがデータベースに見つからない場合は、を発行して、ヘッダー403 FORBIDDENにログイン URL を提案します。エージェントがリダイレクトを自動的にたどらない場合のリンク。Location<a>

ログイン スクリプトは、何をしたいかによって、トークンを使用して列を更新するようにコミットされます。ユーザーが他のクライアントから明示的にログアウトするまで、古いセッションを無効にするか、新しいセッションの作成を防止します (後者は、場合に問題を引き起こします)。ユーザーは以前にログインした古いマシンにアクセスできません。モバイル デバイスの電源がオフになっているか、別の建物にあった可能性があります)。

于 2012-12-02T11:22:22.273 に答える