2009-03-26 6 views
8

私は最近、ユーザー名とパスワードをデータベースに正しく追加する方法を学びました。 私のデータベースはusersysであり、ユーザー情報を格納するテーブルはuserdbです。このテーブルには、username(プライマリ)、passwordの2つのカラムがあります。PHP/MySQLでユーザーを認証するにはどうすればよいですか?

登録フォームはうまく機能し、ユーザーの入力をデータベースに正しく入力し、ユーザーのユーザー名が既にデータベースに入っているかどうかを確認します。

これで、誰でもログインスクリプトの作成を手伝うことができるかどうかを尋ねています。これまでのところ、これは私が持っているものです:

$username = $_POST['username']; 
$password = $_POST['password']; 
$displayname = $_POST['username']; 
$displayname = strtolower($displayname); 
$displayname = ucfirst($displayname);   
echo "Your username: " . $displayname . "<br />"; 

mysql_connect("localhost", "root", "******") or die(mysql_error()); 
echo "Connected to MySQL<br />"; 

mysql_select_db("usersys") or die(mysql_error()); 
echo "Connected to Database <br />"; 

$lcusername = strtolower($username); 
$esclcusername = mysql_real_escape_string($lcusername); 
$escpassword = mysql_real_escape_string($password); 

$result = mysql_query("SELECT * FROM userdb WHERE username='$esclcusername' AND  password='$escpassword'") or die(mysql_error()); 
$row = mysql_fetch_array($result); 
$validateUser = $row['username']; 
$validatePass = $row['password']; 

POSTデータは以前のログインページからのものです。このスクリプトでテーブル(userdb)を確認し、前のフォームから入力したユーザー名の行を見つけて、入力されたパスワードがuserdbテーブルのその行に設定されているユーザー名のパスワードと一致することを確認します。

私はまた、入力されたユーザー名が存在するかどうかを確認するために、テーブルに見つからない場合、入力されたユーザー名が存在しないことをユーザーに知らせる方法も必要です。

+0

を次のように、本当に、それは複雑だから、ユーザーを認証するための簡単な方法は、可能な限り既存の認証フレームワークを再使用する必要があります。たとえば、フレームワークにとらわれずデータベースに依存しないhttps://github.com/delight-im/PHP-Authを見てください。 – caw

答えて

7

セッションを使用できます。セッションは、ユーザーがサイトを参照している間、ユーザーと一緒に留まるグローバル変数です。

公式サイトでPHPを学んでいるので、try out this tutorialです。ユーザー名とパスワードが一致し、あなたがセッション変数に

$_SESSION["auth"] = true; 
$_SESSION["user_id"] = $row["user_id"]; 

を設定し、ユーザーが認証されているかどうかを確認するためにチェックを行う際に

は、しかし、あなたは理論的にはどうなることです。それを行うには

3

一つの方法(免責事項:必ずしもベストプラクティス):

session_start(); 
if(!isset($_SESSION['userId'])) { 
    die('You need to be logged in!!!'); 
} else { 
    echo 'Welcome ' . $_SESSION['username']; 
} 

はPHP sessionsについて詳しく読む:

$result = mysql_query("SELECT id FROM userdb WHERE username='$esclcusername' AND password='$escpassword'") or die(mysql_error()); 
$row = mysql_fetch_array($result); 
$id = (int)$row['id']; 
if($id > 0) { 
    //log in the user 
    session_start(); 
    $_SESSION['userId'] = $id; 
    $_SESSION['username'] = $displayname; 
} 

...と認証を必要とするページ。

0

指定されたユーザ名のパスワードをMySQLから取得するためにselect文を使用できます。空の結果セットがある場合は、テーブルにユーザー名がありません。

ユーザーが複数のPHPページで認証される必要がある場合、1つの選択肢はセッション(http://www.php.net/manual/en/function.session-start.php)を使用している必要があります。

はまた、私はあなたがすなわち、SQLインジェクションを防ぐ、セキュリティを考えるべきだと思う:

$variable = mysql_real_escape_string($_POST['variable']) 

と(エラーを処理し、スクリプトからユーザフレンドリーなメッセージを返す)「死ぬ」ということを避け。

0

あなたのデータベースにパスワードを保存しないことも考えています。 MD5またはSHA1の片方向ハッシュは、dbレベルでセキュリティのレイヤーを追加する方法です。

詳細については、http://php.net/md5またはhttp://php.net/sha1を参照してください。

12

これはこの質問に対する直接の回答ではなく、わかりやすい値です。 データベースに格納する前にパスワードを暗号化するには、MYSQL SHA1関数を使用する必要があります。

$user = $_POST['userid']; 
$pwd = $_POST['password']; 
$insert_sql = "INSERT into USER(userid, password) VALUES($user, SHA1($pwd))"; 

$select_sql = "SELECT * FROM USER WHERE userid=$user AND password=SHA1($pwd))"; 
+2

+1は非常に重要なポイントです。 2つの訂正: 1. SQLインジェクションによってバイパスされないようにするには、コードでmysql_escape_string/mysql_real_escape_string()を使用する必要があります。 2.虹のテーブルにひび割れがないように、ハッシュに塩を使用することをお勧めします。参照:http://tinyurl.com/jwb8o – Fredrik

+0

主な質問にはmysqlエスケープ関数の使用法が示されていますが、パスワードの引用符は使用しないため、この回答は主に安全ではありません。 "$ pwd =" 1)OR(1 = 1 "' – Ferrybig

2

私は、ログインPOSTの両方$_SESSIONMYSQL小切手を使用するようにしたいです。これはいくつかのことを始めるのを助けるはずです。

$username = mysql_real_escape_string($_POST[username]); 
$password = strip_tags($_POST[password]); 
$password = sha1($password); 

if(isset($username) && isset($password) && !empty($username) && !empty($password)) 
{ 
$sql = mysql_query("SELECT * FROM users_column WHERE username = '$username' AND password = '$password'"); 

//Check the number of users against database 
//with the given criteria. We're looking for 1 so 
//adding > 0 (greater than zero does the trick). 
$num_rows = mysql_num_rows($sql); 
if($num_rows > 0){ 

//Lets grab and create a variable from the DB to register 
//the user's session with. 
$gid = mysql_query("SELECT * FROM users_column WHERE username = '$username' AND password = '$password'"); 
$row = mysql_fetch_assoc($gid); 
$uid = $row[userid]; 

// This is where we register the session. 
$_SESSION[valid_user] = $uid; 

//Send the user to the member page. The userid is what the 
//session include runs against. 
header('Location: memberpage.php?userid='.$userid); 
} 

//If it doesn't check out -- throw an error. 
else 
{ 
echo 'Invalid Login Information'; 
} 
} 

注:session_start()でページファイルを起動して、別のセッションのチェックを作成する必要がありますsession_start()と述べ、その後、例えば、あなたの進行などがif($_SESSION[valid_user] != $userid)何かをしてください。

0

ユーザーを認証するときにSESSION変数を使用するという考えに同意します。

//connect the mysql_db 
$mysql_connect() 
$mysql_select_db() 

//reading from mysql table 
$res="SELECT * FROM table WHERE name=$username AND password=$password"; 
$val=mysql_query($res); 

//authentication 
$count=mysql_num_rows($val); 
if($count==1) 
//authenticate the user 
else 
through an error 
+0

この質問は、主な質問にmysqlエスケープ機能の使用法が示されているにもかかわらず、パスワードを引用符で囲まないので主に安全ではありません'$ password =" 1OR1 = 1 "'の形のSQLインジェクションの場合 – Ferrybig