2009-03-26 6 views
8

Vì vậy, gần đây tôi đã học cách thêm đúng tên người dùng và mật khẩu vào cơ sở dữ liệu. Cơ sở dữ liệu của tôi là người dùng và bảng lưu trữ thông tin người dùng được gọi là userdb. Bảng có hai cột - tên người dùng (chính), mật khẩu.Làm cách nào để xác thực người dùng trong PHP/MySQL?

Biểu mẫu đăng ký hoạt động tốt, nhập dữ liệu người dùng nhập vào cơ sở dữ liệu chính xác và cũng kiểm tra xem tên người dùng của người dùng đã có trong cơ sở dữ liệu hay chưa.

Với điều đó đã nói, tôi hỏi liệu có ai có thể giúp tôi tạo tập lệnh đăng nhập hay không. Cho đến nay, đây là những gì tôi có:

$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']; 

Dữ liệu POST là từ trang đăng nhập trước đó. Tôi muốn kịch bản này kiểm tra bảng (userdb) và tìm hàng cho tên người dùng mà người dùng đã nhập từ biểu mẫu trước đó và xác minh rằng mật khẩu đã nhập khớp với mật khẩu của người dùng được đặt trong hàng đó, trong bảng userdb.

Tôi cũng muốn một số loại cách kiểm tra xem có tên người dùng đã nhập hay không, để cho người dùng biết tên người dùng đã nhập không tồn tại nếu không tìm thấy tên trong bảng.

+0

Bạn nên tái sử dụng một khuôn khổ xác thực hiện bất cứ khi nào có thể, bởi vì, thực sự, đó là phức tạp. Ví dụ: hãy xem https://github.com/delight-im/PHP-Auth, cả hai đều không có khung công tác bất khả tri và không có cơ sở dữ liệu. – caw

Trả lời

7

Bạn có thể sử dụng phiên. Phiên là các biến toàn cục khi được đặt, ở lại với người dùng trong khi anh duyệt qua trang web.

Vì bạn đang học PHP, try out this tutorial trên trang web chính thức.

Nhưng bạn sẽ làm gì về mặt lý thuyết là khi tên người dùng và mật khẩu phù hợp, bạn thiết lập một biến phiên

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

Và sau đó làm một kiểm tra để xem nếu người dùng được xác thực.

3

Một cách để làm điều đó (DISCLAIMER: không nhất thiết phải thực hành tốt nhất):

$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; 
} 

... và trên các trang yêu cầu xác thực:

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

Đọc thêm về PHP sessions.

0

Bạn có thể sử dụng câu lệnh chọn để truy xuất từ ​​MySQL mật khẩu cho tên người dùng được chỉ định. Nếu bạn có một tập kết quả trống, thì bạn không có tên người dùng trong bảng.

Nếu bạn cần người dùng được xác thực trong nhiều trang php, thì một lựa chọn sẽ không được sử dụng phiên (http://www.php.net/manual/en/function.session-start.php).

Ngoài ra, tôi nghĩ bạn nên suy nghĩ về an ninh, nghĩa là ngăn chặn SQL injection:

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

và tránh để "chết" (điều trị lỗi và gửi lại thông điệp thân thiện với người từ các tập lệnh).

0

Tôi cũng sẽ nghĩ về việc không lưu trữ mật khẩu trong cơ sở dữ liệu của bạn. Một cách băm với MD5 hoặc SHA1 là một cách để thêm một lớp bảo mật ở cấp db.

Xem http://php.net/md5 hoặc http://php.net/sha1 để biết thêm thông tin.

12

Đây không phải là câu trả lời trực tiếp cho câu hỏi này mà là giá trị gia tăng GOOD. Bạn nên sử dụng hàm MYSQL SHA1 để mã hóa mật khẩu trước khi lưu trữ vào cơ sở dữ liệu.

$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 cho một điểm rất quan trọng. Hai sửa đổi mặc dù: 1. Mã nên sử dụng mysql_escape_string/mysql_real_escape_string() để tránh bị bỏ qua bằng cách tiêm SQL. 2. Sử dụng muối để băm được ưu tiên để tránh bị nứt bởi các bảng cầu vồng. Xem: http://tinyurl.com/jwb8o – Fredrik

+0

Câu trả lời này chủ yếu là không an toàn vì nó không sử dụng dấu ngoặc kép xung quanh mật khẩu, mặc dù câu hỏi chính cho thấy việc sử dụng chức năng thoát mysql, điều này vẫn cho phép tiêm sql trong hình thức của '$ pwd =" 1) HOẶC (1 = 1 "' – Ferrybig

2

Tôi thích sử dụng cả hai $_SESSIONMYSQL Kiểm tra với bất kỳ POST đăng nhập nào. Điều này sẽ giúp bắt đầu một vài điều.

$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'; 
} 
} 

Chú ý: Bạn sẽ cần phải bắt đầu tập trang với session_start() và tạo ra một Kiểm tra phiên riêng biệt bao gồm tuyên bố với session_start() và sau đó cung tiến của bạn ví dụ if($_SESSION[valid_user] != $userid) làm điều gì đó.

0

Tôi đồng ý với ý tưởng nếu sử dụng các biến SESSION trong khi xác thực người dùng.

Cách đơn giản để xác thực người dùng là như sau

//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

Câu trả lời này chủ yếu là không an toàn vì nó không sử dụng dấu ngoặc kép xung quanh mật khẩu, mặc dù câu hỏi chính cho thấy việc sử dụng chức năng thoát mysql, điều này vẫn cho phép cho tiêm sql dưới dạng '$ password =" 1OR1 = 1 "' – Ferrybig