2010-12-01 9 views
0

こんにちは私は質問があります。私はクッキーを使って自分のログインシステムをセットアップしています。しかし、私はこれを行うよりクリーンなバージョンがあるのだろうか。ログインしている場合のみ表示する

<? 
include('../config/db_config.php'); 

$username = $_COOKIE['user']; 
$password = $_COOKIE['pass']; 

$result = mysql_query("SELECT * FROM users WHERE isadmin = 1"); 

while($row = mysql_fetch_array($result)) 
{ 
    if($username == $row['username'] && $password == $row['password']) 
    { 
     //User entered correct username and password 
     echo("ALLOW"); 
    } 
    else 
    { 
     //User entered incorrect username and password 
     echo("DENY"); 
    } 
} 
?> 

私は管理者としてログインしている場合のみすべてのコンテンツを表示したいと思っています。だから、これを行う唯一の方法は、HTML/PHP/Javascriptをエコーする代わりに、ALLOWをエコーすることです。なぜなら、そのページがまだログインしていない状態でも利用可能であるため( "somepage.php"私が同じチェックをしたとしても、私はまだすべてをエコーし​​ています。

+0

セキュリティのすべての愛のために** @ MainMaの記事を読んで**! – zzzzBov

答えて

4
  • なぜすべてのユーザーを読み込み、ユーザー名とパスワードを比較していますか?ユーザー名とパスワードに一致する単一のユーザーを読み込むのが簡単ではないでしょうか?

  • 1人のユーザーを読み込むと、while()が削除されます。

  • PHPでは、はありませんを使用してくださいmysql_query; を実行する PDOを使用してください(必要な場合は、それが良い理由を知るためにGoogleに問い合わせてください)。

  • 入力を確認してください(ここでは非常にオプションですが、私は同意します)。

  • パスワードはプレーンテキスト形式で保存しないでください。

あなたは、おそらく(私は何年もPHP/PDOを使用していないので、コードが不正確でもよい)のような何かを行うことができます:

if (strlen($username)> 128) 
{ 
    // Something wrong. The username is too long. 
} 

$hash = sha1($password); 
$sth = $dbh->prepare('if exists(select * from users where isadmin = 1 and username = :username and password = :password) select 1 else select 0'); 
$sth->bindParam(':username', $username, PDO::PARAM_STR, 128); 
$sth->bindParam(':password', $hash, PDO::PARAM_STR, 40); 
$sth->execute(); 
$isFound = $sth->fetchAll(); 
if ($isFound) 
{ 
    // User entered correct username and password. 
    echo 'ALLOW'; 
} 
+1

もし存在すれば(...)部分には括弧がないかもしれないと思うし、また[this](http://php.net/manual/en/function.sha1.php)によれば、 'sha1 ($ password); 'は20文字ではなく40文字の文字列になります。 –

0

私はあなたが最初にページにアクセスして残りの時間、$ _SESSION ['is_admin']か何かを設定したときにそのようなことを一度行うことをお勧めします各ページを特別なdbコールをしなければなりません。

+1

閲覧中に権限が変更されるとどうなりますか? –

+0

権限が変更された場合は、ログイン手続きがあると仮定してセッション変数を設定することができます。 –

3

ログインしているかどうかを保存するログインページ(またはログインを確認するページ)にセッション変数を設定して、ページ間で持続させることができます。そして、あなたはそうのようなif文の中であなたの管理者のhtmlをシンプルラップすることができます:
$ _SESSION [「isAdmin」]:

<?php 
if ($_SESSION['isAdmin'] == true) { 
?> 
<p>My admin html</p> 
<?php 
} else { 
?> 
<p>My non-admin html</p> 
<?php 
} 
?> 

はちょうどあなたがecho("ALLOW");を持っている部分にこれを追加し、セッションに情報を保存するには=真;

また、スクリプトの先頭にsession_start();を追加することもできます。

+0

これはおそらくOPが何であるかを達成する最も簡単な方法だと思います。私はPHPの人ではありませんが、ASPのようなものであれば、コンテンツが管理者にしか表示されない条件が満たされたときにHTMLをレンダリングします。 – Delebrin

+0

私はこれについて知らなかったありがとう、ありがとう、今私はそれを明確にしています。 – sed

+1

ようこそ。アクセス変数をintとして保存して、複数のレベルのアクセス権を持つことで拡張することができます。また、すべてのユーザーを取得するのではなく、ユーザー名とパスワードのみを照会することもできます。他の人がこれを以下に述べ、SQLインジェクションを忘れることはありません。 –

0

あなたはいつも「somepage.php」を入れることができます以上ドキュメントルート。これは、直接実行を防止する一般的な方法です。

たとえば、Webサーバーが 'project/public_html/index.php'のように見える場合、管理者専用のインクルードを 'project/somepage.php'に入れ、include( "../ somepage.php ")。

明らかに、これは使用する実際のパスに応じて調整する必要があります。

関連する問題