2012-03-13 8 views
0

ログインシステムを実装するのに少し問題がありますが、これはユーザーがクッキーを介して再メリットできますが、同時にサイトを使って不正なアクセスを許可しませんセッション作品Remember Me機能を持つログインフォームとlogin_success.php URLへの不正なサイトアクセスPHP

<?php 
session_start(); 

// IF USER NOT REMEMBERED OR NO SESSION THEN THROW HIM OUT TO LOGIN 
if (!isset($_SESSION['valid'])|| !isset($_COOKIE['myusername'])) 
{ 
    header("Location: index.php"); 
} 

$host="localhost"; // Host name 
$username="root"; // Mysql username 
$password="*****"; // Mysql password 
$db_name="secure_login"; // Database name 
$tbl_name="users"; // Table name 

// Connect to server and select databse. 
mysql_connect("$host", "$username", "$password")or die("cannot connect"); 
mysql_select_db("$db_name")or die("cannot select DB"); 

$sql="SELECT * FROM $tbl_name WHERE username='$myusername'"; 
$result=mysql_query($sql); 


?> 

しかし、すぐに私は、ブラウザを閉じて、自分のサイトにそれを再度開くように私は得る:URL

ここではsuccessful_loginための私のコードで私はリダイレクトエラーが出るよう、問題はここにありますリダイレクトループ

ここです私のフォームを処理する電子コード:

<?php 
session_start(); 
//CHECK IF EITHER SESSION OR COOKIE EXISTS THEN REDIRECT TO LOGIN_SUCCESS ELSE CONTINUE TO FORM 
function loggedin() 
{ 
if (isset($SESSION['valid']) || isset($_COOKIE['myusername'])) 
{ 
     $loggedin = TRUE; 
     return $loggedin; 
} 
} 

if (loggedin()) 
{ 
    header("Location: login_success.php"); 
} 

// REST OF CODE IS PROCESSED AFTER USER CLICKS SUBMIT ON LOGIN FORM 
if(isset($_POST['submit'])) 
{ 

$host="localhost"; // Host name 
$username="root"; // Mysql username 
$password="*****"; // Mysql password 
$db_name="secure_login"; // Database name 
$tbl_name="users"; // Table name 

// Connect to server and select databse. 
mysql_connect("$host", "$username", "$password")or die("cannot connect"); 
mysql_select_db("$db_name")or die("cannot select DB"); 

// username and password sent from form 
$myusername=$_POST['username']; 
$mypassword=$_POST['password']; 
$rememberme=$_POST['rememberme']; 

// To protect MySQL injection (more detail about MySQL injection) 
$myusername = stripslashes($myusername); 
$mypassword = stripslashes($mypassword); 
$myusername = mysql_real_escape_string($myusername); 
$mypassword = mysql_real_escape_string($mypassword); 

$encrypted_mypassword=md5($mypassword); 
$sql="SELECT * FROM $tbl_name WHERE username='$myusername' and password='$encrypted_mypassword'"; 
$result=mysql_query($sql); 

// Mysql_num_row is counting table row 
if(mysql_num_rows($result) == 1) //user exists 
{ 
    if ($rememberme=="on"){ 
     setcookie("myusername", $myusername, time()+7200); 
    } 
elseif ($rememberme==""){ 
     $_SESSION['valid'] = 1; 
    } 

header('Location: login_success.php'); 
exit(); 
} 
if($myusername=="[email protected]" && $encrypted_mypassword=="a66d83940f5d22fa54ee51ce"){ 
header('Location: register.php'); 

} 
else { 
echo '<div class="alert">Incorrect Username or Password!</div>'; 
} 
} 
?> 

ので、基本的にアップラップするために、ユーザーが有効なユーザー名とパスワードを入力し、クリックが私を覚えているとき、私は、ユーザーがブラウザを閉じた場合でも、login_successにリダイレクトするブラウザの好き(すなわち、 COOKIEから私を覚えてください)。すべてのヘルプは大幅

フィリップ・K

答えて

0

に見てください。あなたはそれらを両方とも同時に設定することはありません。リダイレクトループです。 私がすぐに見つけた別の問題は、ユーザーがページにアクセスしたときにクッキー「myusername」を更新するようなことがないことです。

提案したように、既存のソリューションを使用できますが、本当に自分でやりたいのであれば、そのコードを再利用可能な関数/クラスに分割することを強く推奨します。

Md5はユーザーのパスワードを保存する安全な方法ではありません.bcryptなどの既存のソリューションを使用する必要があります。

セッションのハイジャックに対する対策として、各ページ訪問間のIPも確認します(これは、セッションデータをデータベースに格納する必要がありますが、これは良い考えです)。

+0

あなたの解決策は私のURL認証を壊します。ユーザーがsecure.fixnode.ca/login_success.phpを入力すると、制限されたユーザーエリアに入ることができます。 login_successにIF文を追加したのは、ユーザーがサイトに直接アクセスするのを防ぐためです。これは私の最初の試みは、PHPのログインシステムでは、これはプロダクション用の場合は、私はおそらく使用するだろうsha256 –

+0

私の間違い、あなたのロジックが働いた。私は||を変えた&&と私のサイトには、ユーザーが直接URLを入力することができず、Cookieが正しく保存されます。私の次のステップは、私のハッシングシステムをSHA256に変更することです –

+0

実際には、フォームを処理するコードで、正しく、簡単な方法で作成しました: 'if(isset($ SESSION ['valid'])|| isset($ _ COOKIE [ 'myusername'])) ''(!を使用すると|を使用できます) – drwn

0

を高く評価している。しかし、今、ユーザーがブラウザを閉じて、その後、私のサイトを再び開く場合は、ユーザーが原因クッキー

のおそらくREDIRECT LOOPを取得し、私は既成をお勧めします使いやすい認証ソリューションです。

たとえば、http://pear.php.net/package/Auth

if (!isset($_SESSION['valid'])|| !isset($_COOKIE['myusername']))

の代わりに||、あなたが& &を持っている必要があります。問題はここにあるexamples

+0

私は自分のコードと一緒にディレクトリ内に余分なコードを持っているのが好きではないので、Do-It-Yourselfの解決策を思いついています。私はそれを自分でやって同様の結果を達成することができます。しかし、もし私が最後の手段としてあなたの解決策を使用するかもしれないという提案に感謝します。 –

関連する問題