2009-09-04 28 views
8

Làm cách nào để tạo tập lệnh đăng nhập dễ dàng không yêu cầu cơ sở dữ liệu. Tôi muốn nó được an toàn.Kịch bản đăng nhập dễ dàng mà không có cơ sở dữ liệu

Được rồi, những gì về tập lệnh này, tôi chỉ thực hiện theo kiến ​​thức của mình trong php.

<?php 
// Start session 
session_start(); 

// Username and password 
$ID = "admin"; 
$pass = "123456"; 

if (isset($_POST["ID"]) && isset($_POST["pass"])) { 

    if ($_POST["ID"] === $anvandarID && $_POST["pass"] === $pass) { 
    /
    $_SESSION["inloggedin"] = true; 

    header("Location: safe_site.php"); 
    exit; 
    } 
     // Wrong login - message 
     else {$wrong = "Bad ID and password, the system could not log you in";} 
} 
?> 

Các safe_site.php chứa này và một số nội dung:

session_start(); 

if (!isset($_SESSION["inloggning"]) || $_SESSION["inloggning"] !== true) { 
header("Location: login.php"); 
exit; 
} 
+1

Bạn sẽ tạo tập lệnh đăng nhập dễ dàng như thế nào mà không yêu cầu cơ sở dữ liệu trong ASP? – Gumbo

+1

@Gumbo: Với OpenID :) – Sampson

+0

Bây giờ tôi đã thêm ví dụ gì vào bài đăng đầu tiên ở trên đây. –

Trả lời

20

Nó không phải là một giải pháp lý tưởng nhưng đây là một ví dụ nhanh chóng và bẩn cho thấy làm thế nào bạn có thể lưu trữ thông tin đăng nhập trong mã PHP:

<?php 
session_start(); 

$userinfo = array(
       'user1'=>'password1', 
       'user2'=>'password2' 
       ); 

if(isset($_GET['logout'])) { 
    $_SESSION['username'] = ''; 
    header('Location: ' . $_SERVER['PHP_SELF']); 
} 

if(isset($_POST['username'])) { 
    if($userinfo[$_POST['username']] == $_POST['password']) { 
     $_SESSION['username'] = $_POST['username']; 
    }else { 
     //Invalid Login 
    } 
} 
?> 
<!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> 
    </head> 
    <body> 
     <?php if($_SESSION['username']): ?> 
      <p>You are logged in as <?=$_SESSION['username']?></p> 
      <p><a href="?logout=1">Logout</a></p> 
     <?php endif; ?> 
     <form name="login" action="" method="post"> 
      Username: <input type="text" name="username" value="" /><br /> 
      Password: <input type="password" name="password" value="" /><br /> 
      <input type="submit" name="submit" value="Submit" /> 
     </form> 
    </body> 
</html> 
+0

Cảm ơn bạn! Điều đó có thể tốt hơn tôi. –

+0

Không an toàn chút nào. –

+0

Làm thế nào về một số chi tiết? –

0

nếu bạn không có một cơ sở dữ liệu, bạn sẽ phải hardcode các chi tiết đăng nhập trong mã của bạn, hoặc đọc nó từ một tập tin phẳng trên đĩa.

+1

Tôi không thể lưu trữ chi tiết đăng nhập trong các biến? –

+0

Bạn có thể, đó là ý của anh ấy bằng cách "mã hóa chi tiết đăng nhập trong mã của bạn". – jimyi

3

Lưu tên người dùng và mật khẩu băm trong mảng trong tệp php thay vì db.

Khi bạn cần xác thực người dùng, hãy tính toán băm thông tin đăng nhập của mình và sau đó so sánh chúng với băm trong mảng.

Nếu bạn sử dụng hàm băm an toàn (xem hash function and hash algos trong tài liệu PHP), nó sẽ khá an toàn (bạn có thể xem xét sử dụng hàm băm muối) và cũng thêm một số biện pháp bảo vệ cho biểu mẫu.

2

Nếu bạn không có cơ sở dữ liệu, hồ sơ PERMANENT của dữ liệu đăng nhập của người dùng của bạn sẽ được lưu trữ ở đâu? Chắc chắn, trong khi người dùng đăng nhập, thông tin người dùng tối thiểu được yêu cầu để trang web của bạn hoạt động có thể được lưu trữ trong phiên hoặc cookie. Nhưng sau khi họ đăng xuất, thì sao? Phiên này biến mất, cookie có thể bị tấn công.

Vì vậy, người dùng của bạn quay lại trang web của bạn. Anh ấy cố đăng nhập. Điều gì đáng tin cậy khiến trang web của bạn so sánh thông tin đăng nhập của anh ấy?

11

FacebookConnect hoặc OpenID là hai tùy chọn tuyệt vời. Về cơ bản, người dùng của bạn đăng nhập vào các trang web khác họ đã là thành viên (Facebook, hoặc Google), và sau đó bạn nhận được xác nhận từ trang đó cho bạn biết người dùng đáng tin cậy - bắt đầu phiên và họ đã đăng nhập. Không có cơ sở dữ liệu cần thiết (trừ khi bạn muốn kết hợp nhiều dữ liệu hơn vào tài khoản của họ).

+0

URL https://developers.facebook.com/connect.php giờ đây hiển thị * "Rất tiếc, liên kết bạn đã theo dõi có thể bị hỏng hoặc trang có thể đã bị xóa." * - nó sẽ bị xóa. –

0

Bạn có thể làm điều khiển truy cập ở cấp Web server sử dụng HTTP Basic xác thực và htpasswd. Có một số vấn đề với điều này:

  1. Đó là không phải là rất an toàn (username và password được trivially mã hóa trên dây)
  2. Thật khó để duy trì (bạn phải đăng nhập vào máy chủ để thêm hoặc xóa người dùng)
  3. Bạn không có quyền kiểm soát hộp thoại đăng nhập được trình bày bởi trình duyệt
  4. Không có cách nào đăng xuất, không khởi động lại trình duyệt.

Trừ khi bạn đang xây dựng một trang web để sử dụng nội bộ với một vài người dùng, tôi thực sự không khuyên bạn nên sử dụng nó.

-2

Không có lý do gì để không sử dụng cơ sở dữ liệu để thực hiện đăng nhập, ít nhất bạn có thể làm là tải xuống và cài đặt SQLite nếu công ty lưu trữ của bạn không cung cấp cho bạn đủ DB.

8

Tôi sẽ sử dụng một thiết lập hai tập tin như thế này:

index.php

<?php 
session_start(); 

define('DS', TRUE); // used to protect includes 
define('USERNAME', $_SESSION['username']); 
define('SELF', $_SERVER['PHP_SELF']); 

if (!USERNAME or isset($_GET['logout'])) 
include('login.php'); 

// everything below will show after correct login 
?> 

login.php

<?php defined('DS') OR die('No direct access allowed.'); 

$users = array(
"user" => "userpass" 
); 

if(isset($_GET['logout'])) { 
    $_SESSION['username'] = ''; 
    header('Location: ' . $_SERVER['PHP_SELF']); 
} 

if(isset($_POST['username'])) { 
    if($users[$_POST['username']] !== NULL && $users[$_POST['username']] == $_POST['password']) { 
    $_SESSION['username'] = $_POST['username']; 
    header('Location: ' . $_SERVER['PHP_SELF']); 
    }else { 
     //invalid login 
    echo "<p>error logging in</p>"; 
    } 
} 

echo '<form method="post" action="'.SELF.'"> 
    <h2>Login</h2> 
    <p><label for="username">Username</label> <input type="text" id="username" name="username" value="" /></p> 
    <p><label for="password">Password</label> <input type="password" id="password" name="password" value="" /></p> 
    <p><input type="submit" name="submit" value="Login" class="button"/></p> 
    </form>'; 
exit; 
?> 
0

*** ĐĂNG NHẬP kịch bản mà doesnt liên kết đến một cơ sở dữ liệu hoặc tệp bên ngoài. Tốt cho một mật khẩu toàn cầu -

Đặt trên trang dạng Đăng nhập - nơi này ở phía trên cùng của trang đăng nhập - trên mọi thứ khác ***

<?php 

if(isset($_POST['Login'])){ 

if(strtolower($_POST["username"])=="ChangeThis" && $_POST["password"]=="ChangeThis"){ 
session_start(); 
$_SESSION['logged_in'] = TRUE; 
header("Location: ./YourPageAfterLogin.php"); 

}else { 
$error= "Login failed !"; 
} 
} 
//print"version3<br>"; 
//print"username=".$_POST["username"]."<br>"; 
//print"password=".$_POST["username"]; 
?> 

* Đăng nhập vào trang sau - Nơi này tại đầu mỗi trang cần được bảo vệ bằng cách đăng nhập. này sẽ kiểm tra phiên và nếu một tên người dùng và mật khẩu đã *

<?php 
session_start(); 
if(!isset($_SESSION['logged_in']) OR $_SESSION['logged_in'] != TRUE){ 

header("Location: ./YourLoginPage.php"); 
} 
?> 
+0

Không phải là giải pháp này giống như những gì đã có trong câu hỏi ban đầu? – FoolishSeth

1

Hãy thử điều này:

<?php 
     session_start(); 
     $userinfo = array(
      'user'=>'5d41402abc4b2a76b9719d911017c592', //Hello... 
     ); 

     if(isset($_GET['logout'])) { 
      $_SESSION['username'] = ''; 
      header('Location: ' . $_SERVER['PHP_SELF']); 
     } 

     if(isset($_POST['username'])) { 
      if($userinfo[$_POST['username']] == md5($_POST['password'])) { 
       $_SESSION['username'] = $_POST['username']; 
      }else { 
       header("location:403.html"); //replace with 403 
      } 
     } 
?> 
<?php if($_SESSION['username']): ?> 
    <!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> 
      <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
      <title>Logged In</title> 
     </head> 

     <body> 
      <p>You're logged in.</p> 
      <a href="logout.php">LOG OUT</a> 
     </body> 
    </html> 

<?php else: ?> 
    <html> 
     <head> 
      <title>Log In</title> 
     </head> 
     <body> 
      <h1>Login needed</h1> 
      <form name="login" action="" method="post"> 
       <table width="100%" border="0" cellpadding="3" cellspacing="1" bgcolor="#FFFFFF"> 
        <tr> 
         <td colspan="3"><strong>System Login</strong></td> 
        </tr> 
        <tr> 
         <td width="78">Username:</td> 
         <td width="294"><input name="username" type="text" id="username"></td> 
        </tr> 
        <tr> 
         <td>Password:</td> 
         <td><input name="password" type="password" id="password"></td> 
        </tr> 
        <tr> 
         <td>&nbsp;</td> 
         <td><input type="submit" name="Submit" value="Login"></td> 
        </tr> 
       </table> 
      </form> 
     </body> 
    </html> 
<?php endif; ?> 

Bạn sẽ cần một logout, một cái gì đó như thế này (logout.php):

<?php 
    session_start(); 
    session_destroy(); 
    header("location:index.html"); //Replace with Logged Out page. Remove if you want to use HTML in same file. 
?> 

// Below is not needed, unless header above is missing. In that case, put logged out text here. 
<!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> 
     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
     <title>Untitled Document</title> 
    </head> 
    <body> 
     <!-- Put logged out message here --> 
    </body> 
</html> 
+3

Frank, câu trả lời hay - tuy nhiên câu hỏi đã được trả lời và câu trả lời đã được chấp nhận. Nếu bạn muốn giải thích tại sao câu trả lời của bạn khác hoặc tốt hơn câu trả lời được chấp nhận, điều đó có thể hữu ích. –

Các vấn đề liên quan