banner

[Rule] Rules  [Home] Main Forum  [Portal] Portal  
[Members] Member Listing  [Statistics] Statistics  [Search] Search  [Reading Room] Reading Room 
[Register] Register  
[Login] Loginhttp  | https  ]
 
Forum Index Thảo luận hệ điều hành Windows Tạo trang đăng ký và đăng nhập - ST  XML
  [Question]   Tạo trang đăng ký và đăng nhập - ST 26/06/2006 11:19:48 (+0700) | #1 | 947
BigballVN
Elite Member

[Minus]    0    [Plus]
Joined: 12/06/2005 07:25:21
Messages: 610
Offline
[Profile] [PM]
Bạn đang làm 1 website ? Site của bạn thuộc dạng chuyên nghiệp ? hay nghiệp dư ? ... thì cơ bản bạn cũng phải cần đến 1 trang đăng ký dùng để tạo tài khoản và trang đăng nhập dùng để truy nhập tài khoản đã đăng ký. Trong phạm vi bài viết này tôi sẽ trình bày cách viết 1 trang đăng ký, đăng nhập cơ bản mà bạn có thể ứng dụng ngay (Mì ăn liền mà :p).

1. Tạo kết nối database:

Tạo file "mysql.php" có code như sau:


<?php

$db_host = "localhost"; // Giữ mặc định là localhost
$db_name = "sanchoituoitre.info"; // Cần thay đổi..
$db_username = "lyhuuloi"; // Cần thay đổi..
$db_password = "123456"; // Cần thay đổi..

@mysql_connect("{$db_host}", "{$db_username}", "{$db_password}") or die("Không thể kết nối database");
@mysql_select_db("{$db_name}") or die("Không thể chọn database");

?>


Bạn cần phải thay đổi thông tin ở 3 biến $db_name, $db_username, $db_password cho phù hợp với thông tin database của bạn.

1.1. Tạo table "members" dùng dể chứa thông tin thành viên:

Sau đó bạn tạo file "create_members_table.php" có code như sau:


<?php

require_once("mysql.php");

@mysql_query("CREATE TABLE `members` (
`id` INT( 11 ) NOT NULL AUTO_INCREMENT ,
`username` VARCHAR( 128 ) NOT NULL ,
`password` VARCHAR( 32 ) NOT NULL ,
`email` VARCHAR( 255 ) NOT NULL ,
PRIMARY KEY ( `id` )
) TYPE = MYISAM ;");

print "Table \"members\" đã được tạo.";

?>


Bạn tiếp tục chạy luôn file "create_members_table.php" này để tiến hành tạo table "members", sau khi tạo xong thì xóa file này đi. Nếu bạn đã quen sử dụng phpMyAdmin thì bạn có thể tự tạo table này, còn đối với newbie thì nên làm theo cách của tôi, sau này bạn có thể tự tìm hiểu thêm.

2. Tạo trang đăng ký:

Tạo file "register.php" có code như sau:


<?php

// Tải file mysql.php lên
require_once("mysql.php");

if ( $_GET['act'] == "do" )
{

// Dùng hàm addslashes() để tránh SQL injection, dùng hàm md5() để mã hóa password
$username = addslashes( $_POST['username'] );
$password = md5( addslashes( $_POST['password'] ) );
$verify_password = md5( addslashes( $_POST['verify_password'] ) );
$email = addslashes( $_POST['email'] );

// Kiểm tra 4 thông tin, nếu có bất kỳ thông tin chưa điền thì sẽ báo lỗi
if ( ! $username || ! $password || ! $verify_password || ! $email )
{
print "Xin vui lòng nhập đầy đủ các thông tin. <a href='javascript:history.go(-1)'>Nhấp vào đây để quay trở lại</a>";
exit;
}

// Kiểm tra mật khẩu, bắt buộc mật khẩu nhập lúc đầu và mật khẩu lúc sau phải trùng nhau
if ( $password != $verify_password )
{
print "Mật khẩu không giống nhau, bạn hãy nhập lại mật khẩu. <a href='javascript:history.go(-1)'>Nhấp vào đây để quay trở lại</a>";
exit;
}

// Tiến hành tạo tài khoản
@mysql_query("INSERT INTO members (username, password, email) VALUES ('{$username}', '{$password}', '{$email}')");

// Thông báo hoàn tất việc tạo tài khoản
print "Tài khoản {$username} đã được tạo. <a href='login.php'>Nhấp vào đây để đăng nhập</a>";

}
else
{

// Form đăng ký
print <<<EOF
<form action="register.php?act=do" method="post">
Tên truy nhập: <input type="text" name="username" value="">
Mật khẩu: <input type="password" name="password" value="">
Xác nhận mật khẩu: <input type="password" name="verify_password" value="">
Địa chỉ E-mail: <input type="text" name="email" value="">
<input type="submit" name="submit" value="Đăng ký tài khoản">
</form>
EOF;

}

?>


3. Tạo trang đăng nhập:

Tạo file "login.php" có code như sau:


<?php

// Tải file mysql.php lên
require_once("mysql.php");

if ( $_GET['act'] == "do" )
{

// Dùng hàm addslashes() để tránh SQL injection, dùng hàm md5() để mã hóa password
$username = addslashes( $_POST['username'] );
$password = md5( addslashes( $_POST['password'] ) );

// Lấy thông tin của username đã nhập trong table members
$sql_query = @mysql_query("SELECT id, username, password FROM members WHERE username='{$username}'");
$member = @mysql_fetch_array( $sql_query );

// Nếu username này không tồn tại thì....
if ( @mysql_num_rows( $sql_query ) <= 0 )
{
print "Tên truy nhập không tồn tại. <a href='javascript:history.go(-1)'>Nhấp vào đây để quay trở lại</a>";
exit;
}

// Nếu username này tồn tại thì tiếp tục kiểm tra mật khẩu
if ( $password != $member['password'] )
{
print "Nhập sai mật khẩu. <a href='javascript:history.go(-1)'>Nhấp vào đây để quay trở lại</a>";
exit;
}

// Khởi động phiên làm việc (session)
session_start();
$_SESSION['user_id'] = $member['id'];

// Thông báo đăng nhập thành công
print "Bạn đã đăng nhập với tài khoản {$member['username']} thành công. <a href='index.php'>Nhấp vào đây để vào trang chủ</a>";

}
else
{

// Form đăng nhập
print <<<EOF
<form action="login.php?act=do" method="post">
Tên truy nhập: <input type="text" name="username" value="">
Mật khẩu: <input type="password" name="password" value="">
<input type="submit" name="submit" value="Đăng nhập">
</form>
EOF;

}

?>


4. Tạo trang chủ:

Tạo file "index.php" với code như sau:


<?php

// Tải file mysql.php lên
require_once("mysql.php");

// Khởi động phiên làm việc
session_start();

if ( !$_SESSION['user_id'] )
{

print <<<EOF
Bạn chưa đăng nhập! <a href='login.php'>Nhấp vào đây để đăng nhập</a>
EOF;

}
else
{

$user_id = intval($_SESSION['user_id']);

$sql_query = @mysql_query("SELECT * FROM members WHERE id='{$user_id}'");
$member = @mysql_fetch_array( $sql_query );

print <<<EOF
Bạn đang đăng nhập với tài khoản {$member['username']}.
EOF;

}

?>
[Up] [Print Copy]
  [Question]   Tạo trang đăng ký và đăng nhập - ST 27/06/2006 14:25:58 (+0700) | #2 | 1346
[Avatar]
cigcof
Member

[Minus]    0    [Plus]
Joined: 19/04/2006 09:47:48
Messages: 17
Offline
[Profile] [PM]
Mình đã thực hành từng bước rất chính xác theo bạn. Nhưng nó lại báo lỗi ở dòng print <<<EOF trong các file login.php và index.php ? Bạn có thể giải thích giùm chứ. Mình đã sai bước nào chăng ???
[Up] [Print Copy]
  [Question]   Tạo trang đăng ký và đăng nhập - ST 27/06/2006 21:49:02 (+0700) | #3 | 1396
BigballVN
Elite Member

[Minus]    0    [Plus]
Joined: 12/06/2005 07:25:21
Messages: 610
Offline
[Profile] [PM]

cigcof wrote:
Mình đã thực hành từng bước rất chính xác theo bạn. Nhưng nó lại báo lỗi ở dòng print <<<EOF trong các file login.php và index.php ? Bạn có thể giải thích giùm chứ. Mình đã sai bước nào chăng ??? 



<?php

$db_host = "localhost"; // Giữ mặc định là localhost
$db_name = "sanchoituoitre.info"; // Cần thay đổi..
$db_username = "lyhuuloi"; // Cần thay đổi..
$db_password = "123456"; // Cần thay đổi..
 

Bạn cần thay đổi thông tin giống như thông tin trong MySQL của bạn mới chạy đc. smilie
[Up] [Print Copy]
  [Question]   Tạo trang đăng ký và đăng nhập - ST 28/06/2006 01:07:51 (+0700) | #4 | 1484
[Avatar]
phamquoc_truong
Elite Member

[Minus]    0    [Plus]
Joined: 04/04/2004 07:54:12
Messages: 79
Location: PeaceWorld
Offline
[Profile] [PM]
Hê hê !
Bằng sự kém hiểu biết của mình, em muốn nói đôi lời về code này(nếu có gì sai mong anh em chỉ dạy thêm smilie)
Thứ nhất :
Code:
// Nếu username này không tồn tại thì.... 
if ( @mysql_num_rows( $sql_query ) <= 0 )

Mình thì chưa thấy @mysql_num_rows( $sql_query ) <0 bao giờ nên cũng hơi buồn cười khi thấy code này . . . thường thì mình làm là
Code:
if ( @mysql_num_rows( $sql_query ) == 0 )

Thứ 2 : Để đỡ tốn thời gian của user cũng như "bớt việc" cho server, mình kiểm tra toàn bộ thông tin người dùng ngay trên trang đăng kí, chứ không để lên trên server mới làm. Như vậy theo mình sẽ bỏ:
Code:
// Kiểm tra 4 thông tin, nếu có bất kỳ thông tin chưa điền thì sẽ báo lỗi 
if ( ! $username || ! $password || ! $verify_password || ! $email ) 
{ 
print "Xin vui lòng nhập đầy đủ các thông tin. <a href='javascript:history.go(-1)'>Nhấp vào đây để quay trở lại</a>"; 
exit; 
} 

// Kiểm tra mật khẩu, bắt buộc mật khẩu nhập lúc đầu và mật khẩu lúc sau phải trùng nhau 
if ( $password != $verify_password ) 
{ 
print "Mật khẩu không giống nhau, bạn hãy nhập lại mật khẩu. <a href='javascript:history.go(-1)'>Nhấp vào đây để quay trở lại</a>"; 
exit; 
}

Cũng vừa để cho chắc ăn, vừa chống flood, vừa kiểm tra được user đã đăng kí hay chưa (cái kiểm tra user exists trên code chưa có à nha), em dùng một type=hidden, name="anti_flood", value=một dẫy số do em tạo ra(theo một quy luật nào đó mà mình có thể kt được nó đúng hay sai).
Nếu như dẫy số này trên server kt là đúng thì sẽ :
Code:
$kt_user = @mysql_query("SELECT id FROM members WHERE username='$username'"); 
if(@mysql_num_rows($kt_user)!=0)
{
echo "UserName này đã tồn tại. Mời bạn chọn User Nam khác !";
exit;
}
else 
{
// Tiến hành tạo tài khoản 
@mysql_query("INSERT INTO members (username, password, email) VALUES ('{$username}', '{$password}', '{$email}')"); 

// Thông báo hoàn tất việc tạo tài khoản 
print "Tài khoản {$username} đã được tạo. <a href='login.php'>Nhấp vào đây để đăng nhập</a>"; 
}


Còn việc
Code:
if ( !$_SESSION['user_id'] ) 
{ 

print <<<EOF 
Bạn chưa đăng nhập! <a href='login.php'>Nhấp vào đây để đăng nhập</a> 
EOF; 

}

Thì chuối một tí (sorry, nếu em sai !). Như mọi người đã biết giá trị của session sẽ xuyên suốt trong quá trình user làm việc với 1 cửa sổ, cho dù user chuyển từ trang này sang trang kia, trừ khi giá trị đó bị thay đổi hoặc phá huỷ. Như vậy chỗ này, em chỉ cần tạo một cái
Code:
$_SESSION['user_id']=1;//thường của admin smilie

trên máy (hay trên host) rồi cũng từ cửa sổ đó chuyển sang trang đăng nhập này . . . hê hê . . . bạn đoán xem chuyện gì sẽ xảy ra ?????
Theo mình là dùng setcokie (mặc dù không được tiện khi người dùng tắt cookie trên duyệt trình).
Sau khi kiểm tra các bước đăng nhập xong ta sẽ :
Code:
@setcookie("user","$member[1]",time()+30*24*60*60,"tendomain") //sét trong 1 tháng smilie
@setcookie("pw","$member[2]",time()+30*24*60*60,"tendomain") //sét trong 1 tháng smilie

và đoạn này
Code:
if ( !$_SESSION['user_id'] ) 
{ 

print <<<EOF 
Bạn chưa đăng nhập! <a href='login.php'>Nhấp vào đây để đăng nhập</a> 
EOF; 

}

thay bằng
Code:
if ( ! $_COOKIE["user"] || !$_COOKIE["pw"] ) 
{ 

print <<<EOF 
Bạn chưa đăng nhập! <a href='login.php'>Nhấp vào đây để đăng nhập</a> 
EOF; 

} 
else
{
...... <== kt cookie. Nếu đúng thì thông báo đã đăng nhập, nếu sai thì echo "Thằng nào thích fake hả ?"; smilie
}

^_^ đó là những gì trong cái đầu bé ít chữ của em . . . các bác tham khảo nếu có sai thì các bác đừng vác đá táng đầu em smilie

HAVE FUN!
[Up] [Print Copy]
  [Question]   Tạo trang đăng ký và đăng nhập - ST 30/06/2006 01:36:43 (+0700) | #5 | 2180
Mr An Luong
Member

[Minus]    0    [Plus]
Joined: 28/06/2006 11:55:16
Messages: 12
Location: TP HCM
Offline
[Profile] [PM] [Email] [WWW] [Yahoo!]

phamquoc_truong wrote:

Thứ 2 : Để đỡ tốn thời gian của user cũng như "bớt việc" cho server, mình kiểm tra toàn bộ thông tin người dùng ngay trên trang đăng kí, chứ không để lên trên server mới làm. Như vậy theo mình sẽ bỏ:
Code:
// Kiểm tra 4 thông tin, nếu có bất kỳ thông tin chưa điền thì sẽ báo lỗi 
if ( ! $username || ! $password || ! $verify_password || ! $email ) 
{ 
print "Xin vui lòng nhập đầy đủ các thông tin. <a href='javascript:history.go(-1)'>Nhấp vào đây để quay trở lại</a>"; 
exit; 
} 

// Kiểm tra mật khẩu, bắt buộc mật khẩu nhập lúc đầu và mật khẩu lúc sau phải trùng nhau 
if ( $password != $verify_password ) 
{ 
print "Mật khẩu không giống nhau, bạn hãy nhập lại mật khẩu. <a href='javascript:history.go(-1)'>Nhấp vào đây để quay trở lại</a>"; 
exit; 
}

 

ehèm, cái thứ hai của bạn đóa , đành rằng công việc kiếm tra nên để ở phía client thì tốt hơn nhưng mà cũng không thể nào không kiểm tra ở phía Server, hãy tưởng tượng, nếu dữ liệu được gửi đến Server của bạn không thông qua trình duyệt (nơi mà có sẵn các mã JavaScript xử lý trước dữ liệu) mà được gửi lên từ một ứng dụng thứ ba thì sao ? Khi đó thì rõ ràng bạn không thể kiểm soát được cái nào được gửi lên và dĩ nhiên khả năng xảy ra lỗi là rất lớn.

Thật ra việc để cho trình duyệt phía Client tự kiếm tra dữ liệu trước chỉ là một thủ thuật để nhằm tiết kiệm thời gian cho USER và phần nào giúp đỡ Server đỡ mệt mỏi thôi. Chúng ta không thể phủ định tầm quan trọng của việc kiếm tra dữ liệu phía Server.
[Up] [Print Copy]
  [Question]   Re: Tạo trang đăng ký và đăng nhập - ST 01/07/2006 10:38:06 (+0700) | #6 | 2767
[Avatar]
iceface
Member

[Minus]    0    [Plus]
Joined: 31/08/2003 12:48:42
Messages: 13
Location: Bà Rịa - Vũng Tàu
Offline
[Profile] [PM]
Thì chuối một tí (sorry, nếu em sai !). Như mọi người đã biết giá trị của session sẽ xuyên suốt trong quá trình user làm việc với 1 cửa sổ, cho dù user chuyển từ trang này sang trang kia, trừ khi giá trị đó bị thay đổi hoặc phá huỷ. Như vậy chỗ này, em chỉ cần tạo một cái


Code:
$_SESSION['user_id']=1;//thường của admin



trên máy (hay trên host) rồi cũng từ cửa sổ đó chuyển sang trang đăng nhập này . . . hê hê . . . bạn đoán xem chuyện gì sẽ xảy ra ?????  


làm cách nào mà tạo 1 biến session trên máy vậy? còn tạo trên host = local attack? :shock:
[Up] [Print Copy]
  [Question]   Tạo trang đăng ký và đăng nhập - ST 01/07/2006 22:17:44 (+0700) | #7 | 2853
Mr An Luong
Member

[Minus]    0    [Plus]
Joined: 28/06/2006 11:55:16
Messages: 12
Location: TP HCM
Offline
[Profile] [PM] [Email] [WWW] [Yahoo!]
theo minh biet la nhuoi ta dung cookie de luu thong tin tren may client ma, lam gi co chien tao session tren may cua user
[Up] [Print Copy]
  [Question]   Tạo trang đăng ký và đăng nhập - ST 02/07/2006 07:28:38 (+0700) | #8 | 3034
[Avatar]
phamquoc_truong
Elite Member

[Minus]    0    [Plus]
Joined: 04/04/2004 07:54:12
Messages: 79
Location: PeaceWorld
Offline
[Profile] [PM]
TO Mr An Luong
Bạn nói 2 điều thì 2 điều đều sai !
Điều thứ nhất :
ehèm, cái thứ hai của bạn đóa , đành rằng công việc kiếm tra nên để ở phía client thì tốt hơn nhưng mà cũng không thể nào không kiểm tra ở phía Server, hãy tưởng tượng, nếu dữ liệu được gửi đến Server của bạn không thông qua trình duyệt (nơi mà có sẵn các mã JavaScript xử lý trước dữ liệu) mà được gửi lên từ một ứng dụng thứ ba thì sao ? Khi đó thì rõ ràng bạn không thể kiểm soát được cái nào được gửi lên và dĩ nhiên khả năng xảy ra lỗi là rất lớn.

Thật ra việc để cho trình duyệt phía Client tự kiếm tra dữ liệu trước chỉ là một thủ thuật để nhằm tiết kiệm thời gian cho USER và phần nào giúp đỡ Server đỡ mệt mỏi thôi. Chúng ta không thể phủ định tầm quan trọng của việc kiếm tra dữ liệu phía Server.  

Thế bạn đã đọc cái dòng này chưa ?
Cũng vừa để cho chắc ăn, vừa chống flood, vừa kiểm tra được user đã đăng kí hay chưa (cái kiểm tra user exists trên code chưa có à nha), em dùng một type=hidden, name="anti_flood", value=một dẫy số do em tạo ra(theo một quy luật nào đó mà mình có thể kt được nó đúng hay sai).
Nếu như dẫy số này trên server kt là đúng thì sẽ : .... 

Chỉ khi nào user submit bằng chính web của mình thì cái anti_flood mới được gán. Và nó sẽ được kiểm tra trên server. Nếu nó chưa được gán hoặc gán sai giá trị <== Flood và sẽ bị loại ngay. Như vậy sẽ không thể có chuyện :
dữ liệu được gửi đến Server của bạn không thông qua trình duyệt (nơi mà có sẵn các mã JavaScript xử lý trước dữ liệu) mà được gửi lên từ một ứng dụng thứ ba 


Điều thứ 2 : Code:
theo minh biet la nhuoi ta dung cookie de luu thong tin tren may client ma, lam gi co chien tao session tren may cua user

Cookie có một vài vấn đề không thích hợp brower trong trường hợp brower của người dùng không chấp nhận cookie. Người dùng có thể vô hiệu hoá cookie trong brower. Do cookie lưu thông tin cá nhân trên máy khách nên hầu hết người dùng đều không muốn. Đó là lý do người dùng có thể vô hiệu hoá chức năng chấp nhận cookie. smilie
lam gi co chien tao session tren may cua user . . . hì hì câu này mình đâu có nói. smilie
Do máy mình cài apache + php nên hoàn toàn mình có thể tạo 1 session.
@TO Mr An Luong & iceface
Có thể mình nhầm. Mình vừa tạo và vừa kiểm tra session ngay trên localhost của mình, nên có thể đã dẫn đến hiện tượng trên. Cảm ơn 2 bạn.

P/S : Xin lưu ý bác : Bigball_hacker. Bê bài của người khác từ nơi khác sang mà không đề tên tác giả là thế nào ?
HAVE FUN !
[Up] [Print Copy]
  [Question]   Tạo trang đăng ký và đăng nhập - ST 02/07/2006 09:10:42 (+0700) | #9 | 3062
lyhuuloi
Elite Member

[Minus]    0    [Plus]
Joined: 04/04/2003 11:29:17
Messages: 90
Location: TP HCM
Offline
[Profile] [PM] [Email] [WWW] [Yahoo!]
Code:
if ( @mysql_num_rows( $sql_query ) == 0 )

Code:
if ( @mysql_num_rows( $sql_query ) <= 0 )

Mình cảm thấy không có gì đáng cười khi cẩn thận kiểm tra cả trường hợp âm lẫn trường hợp = 0 smilie

Để đỡ tốn thời gian của user cũng như "bớt việc" cho server, mình kiểm tra toàn bộ thông tin người dùng ngay trên trang đăng kí, chứ không để lên trên server mới làm. Như vậy theo mình sẽ bỏ:
Code:
// Kiểm tra 4 thông tin, nếu có bất kỳ thông tin chưa điền thì sẽ báo lỗi 
 if ( ! $username || ! $password || ! $verify_password || ! $email ) 
 { 
 print "Xin vui lòng nhập đầy đủ các thông tin. <a href='javascript:history.go(-1)'>Nhấp vào đây để quay trở lại</a>"; 
 exit; 
 } 
 
 // Kiểm tra mật khẩu, bắt buộc mật khẩu nhập lúc đầu và mật khẩu lúc sau phải trùng nhau 
 if ( $password != $verify_password ) 
 { 
 print "Mật khẩu không giống nhau, bạn hãy nhập lại mật khẩu. <a href='javascript:history.go(-1)'>Nhấp vào đây để quay trở lại</a>"; 
 exit; 
 }

 


Và Bạn đã rất ẩu khi thay code mà không kiểm tra lại những gì mình viết, như vậy ở đoạn code của bạn thay lại đã thiếu:

1. Kiểm tra mật khẩu nhập lần đầu, và mật khẩu xác nhận có khớp với nhau hay không ( cũng chẳng thèm kiểm tra coi có nhập mật khẩu chưa smilie ).
2. Kiểm tra email có điền chưa.

Code:
if ( !$_SESSION['user_id'] ) 
 { 
 
....
 
 }

Đúng là đầu bạn bé và ít chữ như bạn đã thừa nhận, nên bạn đã không hiểu dụng ý của mình khi viết đoạn này - mục đích của đoạn này chỉ là để kiểm tra xem có đăng nhập hay chưa thôi bạn ạ.


Thì chuối một tí (sorry, nếu em sai !). Như mọi người đã biết giá trị của session sẽ xuyên suốt trong quá trình user làm việc với 1 cửa sổ, cho dù user chuyển từ trang này sang trang kia, trừ khi giá trị đó bị thay đổi hoặc phá huỷ. Như vậy chỗ này, em chỉ cần tạo một cái
trên máy (hay trên host) rồi cũng từ cửa sổ đó chuyển sang trang đăng nhập này . . . hê hê . . . bạn đoán xem chuyện gì sẽ xảy ra ?????  

Tớ không phủ định nhận định của bạn, nhưng bạn có thể test lại smilie Tui chắc là bạn chưa test thì phải smilie)

http://lyhuuloi.com smilie
[Up] [Print Copy]
  [Question]   Tạo trang đăng ký và đăng nhập - ST 03/07/2006 00:56:16 (+0700) | #10 | 3190
[Avatar]
phamquoc_truong
Elite Member

[Minus]    0    [Plus]
Joined: 04/04/2004 07:54:12
Messages: 79
Location: PeaceWorld
Offline
[Profile] [PM]
Trời ơi ! Bó ch*m ! Bác Lợi ơi là bác Lợi !
mình kiểm tra toàn bộ thông tin người dùng ngay trên trang đăng kí 

Em nói ngắn gọn lại thế này nhé :
1) Nếu như user vào trang đăng kí, mình sẽ gắn cho họ một cái flag (người thì cookie, người thi session ...) còn em, em sẽ tạo ra một giá trị của biến anti_flood. Và nếu như người dùng không vào trang đăng kí thì sẽ không được nhận giá trị này. Nếu trên server kiểm tra, không có giá trị flood hoặc giá trị này sai, truy vấn sẽ bị loại bỏ. Cái giá trị này của anti_flood này một phần em dựa vào quy luật một phần dựa vào session => mỗi giá trị gần như là duy nhất => không thể nào làm giả được => người dùng bắt buộc phải vào trang đăng kí thật để đăng kí.
2) Mình sẽ kiểm tra
//Kiểm tra 4 thông tin, nếu có bất kỳ thông tin chưa điền thì sẽ báo lỗi
// Kiểm tra mật khẩu, bắt buộc mật khẩu nhập lúc đầu và mật khẩu lúc sau phải trùng nhau  

Tất tần tật bằng javascript như mình đã nói
mình kiểm tra toàn bộ thông tin người dùng ngay trên trang đăng kí 

như vậy dòng này :
Và Bạn đã rất ẩu khi thay code mà không kiểm tra lại những gì mình viết, như vậy ở đoạn code của bạn thay lại đã thiếu:

1. Kiểm tra mật khẩu nhập lần đầu, và mật khẩu xác nhận có khớp với nhau hay không ( cũng chẳng thèm kiểm tra coi có nhập mật khẩu chưa ).
2. Kiểm tra email có điền chưa.  

mình hoàn toàn phủ nhận. Xin mọi người hãy đọc kĩ nhé !
Form đăng kí như thế này :
Code:
<form action="register.php?act=do" method="post" name="form_reg" onsubmit="return kiemtra();"> 
Tên truy nhập: <input type="text" name="username" value=""> 
Mật khẩu: <input type="password" name="password" value=""> 
Xác nhận mật khẩu: <input type="password" name="verify_password" value=""> 
Địa chỉ E-mail: <input type="text" name="email" value=""> 
<input type="submit" name="submit" value="Đăng ký tài khoản"> 
</form>

Và đây là đoạn code kiểm tra bằng javascript mà bài trước em chỉ nói qua(mình nghĩ rằng nó rất dễ chỉ cần nói ra là mọi người đã hiểu . . .)
Code:
function ktEmail(s)
{   
  if (s=="") return false;
  if(s.indexOf(" ")>0) return false;
  if(s.indexOf("@")==-1) return false;
  var i = 1;
  var dodai = s.length;
  if (s.indexOf(".")==-1) return false;
  if (s.indexOf("..")!=-1) return false;
  if (s.indexOf("@")!=s.lastIndexOf("@")) return false;
  if (s.lastIndexOf(".")==s.length-1) return false;
  var str="0123456789abcdefghikjlmnopqrstuvwxyz-@._"; 
  for(var j=0;j<s.length;j++)
	if(str.indexOf(s.charAt(j))==-1)
		return false;
   return true;
}
function trong(s)
{   
	return ((s == null) || (s.length == 0))
}
function khoangtrang (s)
{   
	var whitespace = " \t\n\r";
	var i;

  if (trong(s)) return true;
  for (i = 0; i < s.length; i++)
  {   
    var c = s.charAt(i);
    if (whitespace.indexOf(c) == -1) return false;
  }
  return true;
}
function so(c){
	return (c>="0" && c<="9");
}
function sos(str)
{
var kt=true;
for(var i=0;i<str.length;i++)
	{
		if(!isNumer(str.charAt(i)))
			{
				kt=false;
				break;
			}
	}
	return kt;	
}
function kiemtra()
{
	sai=0;
	for(i=0;i<document.form_reg.elements.length-1;i++)
	{
		if(form_reg.elements[i].value=='')
		{
			alert('Bạn phải nhập đầy đủ thông tin !');
			form_reg.elements[i].focus();
			sai=1;
			break;
		}
	}
	if(form_reg.password.value!=form_reg.verify_password.value && sai==0)
	{
		alert('2 mật khẩu không trùng nhau !');
		form_reg.password.focus();
		sai=1;
	}
	if (!ktEmail(form_reg.email.value) && sai==0)
	{
		alert("Bạn đã nhập sai email !");
		form_reg.email.focus();
		sai=1;
	}
	if(sai==1)
		return false;
	else
		return true;
}

Đoạn code của bác không kt user đã tồn tại hay chưa, email nhập vào cũng không kiểm tra xem nó có nhập vào là 1 email hay không, cũng chưa chống flood nốt.
Nếu như mình còn có gì chưa đúng, xin mọi người tiếp tục chỉ dạy . . .

HAVE FUN !
[Up] [Print Copy]
  [Question]   Tạo trang đăng ký và đăng nhập - ST 03/07/2006 04:31:38 (+0700) | #11 | 3248
BigballVN
Elite Member

[Minus]    0    [Plus]
Joined: 12/06/2005 07:25:21
Messages: 610
Offline
[Profile] [PM]

Mr An Luong wrote:
theo minh biet la nhuoi ta dung cookie de luu thong tin tren may client ma, lam gi co chien tao session tren may cua user 

Chán. Thế tui để chữ ST làm chi nhỉ? smilie
[Up] [Print Copy]
  [Question]   Tạo trang đăng ký và đăng nhập - ST 03/07/2006 06:49:00 (+0700) | #12 | 3304
lyhuuloi
Elite Member

[Minus]    0    [Plus]
Joined: 04/04/2003 11:29:17
Messages: 90
Location: TP HCM
Offline
[Profile] [PM] [Email] [WWW] [Yahoo!]
Tất tần tật bằng javascript như mình đã nói  

Lại ẩu smilie Mình sẽ disable javascript thì bạn kiểm tra bằng cách gì ? Làm theo kiểu bạn là trường hợp trăm năm hiếm thấy smilie

Và bạn nên nhớ rằng đây là một bài viết cơ bản về PHP, bạn lại bỏ đi PHP mà dùng Javascript thay thế thì... bó tay smilie

Các bác mod, admin làm ơn khoá bài này lại hộ, kẻo lại dài ngoằn vì những nhận xét không thực tế smilie
http://lyhuuloi.com smilie
[Up] [Print Copy]
  [Question]   Tạo trang đăng ký và đăng nhập - ST 05/07/2006 03:07:38 (+0700) | #13 | 3888
Mr An Luong
Member

[Minus]    0    [Plus]
Joined: 28/06/2006 11:55:16
Messages: 12
Location: TP HCM
Offline
[Profile] [PM] [Email] [WWW] [Yahoo!]

Bigball_hacker wrote:

Mr An Luong wrote:
theo minh biet la nhuoi ta dung cookie de luu thong tin tren may client ma, lam gi co chien tao session tren may cua user 

Chán. Thế tui để chữ ST làm chi nhỉ? smilie 


The chu ST nghi la gi vay, khong hieu ????
Con bac phamquoc_truong bao rang neu user truy cap vao trang dang ky thi moi duoc gan bien anti_flood cho gi, nhung neu user ko vao trang do bang trinh duyet ma cung bang mot ung dung thu 3 thi sao ???
[Up] [Print Copy]
  [Question]   Tạo trang đăng ký và đăng nhập - ST 05/07/2006 09:01:30 (+0700) | #14 | 4011
[Avatar]
phamquoc_truong
Elite Member

[Minus]    0    [Plus]
Joined: 04/04/2004 07:54:12
Messages: 79
Location: PeaceWorld
Offline
[Profile] [PM]
Con bac phamquoc_truong bao rang neu user truy cap vao trang dang ky thi moi duoc gan bien anti_flood cho gi, nhung neu user ko vao trang do bang trinh duyet ma cung bang mot ung dung thu 3 thi sao ??? 

Thế thì cho nó vào đến trình duyệt thứ 100 hay một nghìn thì làm gì được vậy ? Bạn có hiểu bạn nói cái gì không ?
Và nếu như người dùng không vào trang đăng kí thì sẽ không được nhận giá trị này. Nếu trên server kiểm tra, không có giá trị flood hoặc giá trị này sai, truy vấn sẽ bị loại bỏ. Cái giá trị này của anti_flood này một phần em dựa vào quy luật một phần dựa vào session => mỗi giá trị gần như là duy nhất => không thể nào làm giả được => người dùng bắt buộc phải vào trang đăng kí thật để đăng kí. 

@To bác lyhuuloi. Vâng bác thử dít-sa-bờ-lết cái cookie đi rồi vào mấy diễn đàn mà đăng nhập xem ! => IPB không thực tế, VBB không thực tế, *forum không thực tế. Còn bác thì thực tế đến nỗi một user có thể có mấy thằng đăng kí. Bác thực tế quá !

Cái gì mọi người góp ý, em xin ghi nhận . . . và cũng xin chào topic này. Em chả muốn anh em căng thẳng thêm nữa đâu nha. . .

HAVE FUN !
[Up] [Print Copy]
  [Question]   Re: Tạo trang đăng ký và đăng nhập - ST 05/07/2006 10:36:12 (+0700) | #15 | 4040
[Avatar]
micr0vnn
Member

[Minus]    0    [Plus]
Joined: 29/06/2006 15:52:34
Messages: 67
Offline
[Profile] [PM]
hixx... mấy anh ghê thật..... em không biết gì cả.....
Kinh ... giỏi kinh ....... Chỉ em... em không biết làm ......
Bình thường em không biết mí cái nì ............

Có source gửi cho em ... nghiên cứu ...
Đúng là ...... em nhìn lại em không biết gì cả...
smilie smilie smilie smilie
[Up] [Print Copy]
  [Question]   Tạo trang đăng ký và đăng nhập - ST 05/07/2006 19:51:24 (+0700) | #16 | 4112
lyhuuloi
Elite Member

[Minus]    0    [Plus]
Joined: 04/04/2003 11:29:17
Messages: 90
Location: TP HCM
Offline
[Profile] [PM] [Email] [WWW] [Yahoo!]
@To bác lyhuuloi. Vâng bác thử dít-sa-bờ-lết cái cookie đi rồi vào mấy diễn đàn mà đăng nhập xem ! => IPB không thực tế, VBB không thực tế, *forum không thực tế. Còn bác thì thực tế đến nỗi một user có thể có mấy thằng đăng kí. Bác thực tế quá !  

Không biết bạn có từng xem qua sources của IPB và VBB ở phần login và register chưa nhỉ smilie

Họ cũng sẽ kiểm tra xem có nhập: tên, mật khẩu và email thôi bạn à smilie Bạn không tin thì bạn disable javascript rồi đăng ký mà không nhập gì vào xem coi có báo lỗi không.

Nếu có thì chứng minh rằng đoạn PHP kiểm tra các thông tin nhập khi đăng ký là hoàn toàn đúng bạn à.

Và dường như bạn đã nhầm khi không xem rõ đoạn code mà trước giờ bàn là nằm ở phần đăng ký chứ không phải phần đăng nhập smilie
http://lyhuuloi.com smilie
[Up] [Print Copy]
  [Question]   Tạo trang đăng ký và đăng nhập - ST 05/07/2006 22:15:45 (+0700) | #17 | 4138
[Avatar]
Dungna
Member

[Minus]    0    [Plus]
Joined: 23/06/2004 01:49:41
Messages: 114
Location: .... mùa này vắ
Offline
[Profile] [PM] [WWW]
Không phải thế đâu micr0vnn ạ !
[Up] [Print Copy]
  [Question]   Re: Tạo trang đăng ký và đăng nhập - ST 04/11/2007 22:52:07 (+0700) | #18 | 95303
[Avatar]
hoaitvn
Member

[Minus]    0    [Plus]
Joined: 29/10/2007 18:14:58
Messages: 25
Offline
[Profile] [PM] [Email] [Yahoo!] [MSN]
Các huynh ơi cho em hỏi cái ạ. Em cũng thử làm như bác hướng dẫn nhưng mà khi tạo file register.php thì có hiện tượng như sau: (Mời các huynh xem lại code ạ)
2. Tạo trang đăng ký:
Tạo file "register.php" có code như sau:
<?php
// Tải file mysql.php lên
require_once("mysql.php");

if ( $_GET['act'] == "do" )
{

// Dùng hàm addslashes() để tránh SQL injection, dùng hàm md5() để mã hóa password
$username = addslashes( $_POST['username'] );
$password = md5( addslashes( $_POST['password'] ) );
$verify_password = md5( addslashes( $_POST['verify_password'] ) );
$email = addslashes( $_POST['email'] );

// Kiểm tra 4 thông tin, nếu có bất kỳ thông tin chưa điền thì sẽ báo lỗi
if ( ! $username || ! $password || ! $verify_password || ! $email )
{
print "Xin vui lòng nhập đầy đủ các thông tin. <a href='javascript:history.go(-1)'>Nhấp vào đây để quay trở lại</a>";
exit;
}

// Kiểm tra mật khẩu, bắt buộc mật khẩu nhập lúc đầu và mật khẩu lúc sau phải trùng nhau
if ( $password != $verify_password )
{
print "Mật khẩu không giống nhau, bạn hãy nhập lại mật khẩu. <a href='javascript:history.go(-1)'>Nhấp vào đây để quay trở lại</a>";
exit;
}

// Tiến hành tạo tài khoản
@mysql_query("INSERT INTO members (username, password, email) VALUES ('{$username}', '{$password}', '{$email}')");

// Thông báo hoàn tất việc tạo tài khoản
print "Tài khoản {$username} đã được tạo. <a href='login.php'>Nhấp vào đây để đăng nhập</a>";

}
else
{
// Form đăng ký
print <<<EOF
<form action="register.php?act=do" method="post">
Tên truy nhập: <input type="text" name="username" value="">
Mật khẩu: <input type="password" name="password" value="">
Xác nhận mật khẩu: <input type="password" name="verify_password" value="">
Địa chỉ E-mail: <input type="text" name="email" value="">
<input type="submit" name="submit" value="Đăng ký tài khoản">
</form>
EOF;

}
?>

Thì nó báo lỗi: Parse error: parse error in e:\appserv\www\hoa\register.php on line 34
. Em ko hiểu vì sao nữa. Dòng 34 là dòng print <<<EOF . Có phải là nó ko hiểu dòng đó ko hả các huynh. Lần trước em nhớ cũng dùng câu lệnh print <<<EOF...EOF; và nó cũng báo lỗi tương tự như thế (vẫn chưa giải thích được lỗi đó). Và thực tế em cũng chưa hiểu thật sự nó có ý nghĩa gì? Mong các huynh giải thích giùm em. Thanks.
[Up] [Print Copy]
  [Question]   Re: Tạo trang đăng ký và đăng nhập - ST 04/11/2007 23:28:43 (+0700) | #19 | 95307
[Avatar]
gsmth
Elite Member

[Minus]    0    [Plus]
Joined: 15/02/2007 13:25:36
Messages: 749
Offline
[Profile] [PM] [WWW] [Yahoo!]

hoaitvn wrote:
Các huynh ơi cho em hỏi cái ạ. Em cũng thử làm như bác hướng dẫn nhưng mà khi tạo file register.php thì có hiện tượng như sau: (Mời các huynh xem lại code ạ)
2. Tạo trang đăng ký:
Tạo file "register.php" có code như sau:
<?php
// Tải file mysql.php lên
require_once("mysql.php");

if ( $_GET['act'] == "do" )
{

// Dùng hàm addslashes() để tránh SQL injection, dùng hàm md5() để mã hóa password
$username = addslashes( $_POST['username'] );
$password = md5( addslashes( $_POST['password'] ) );
$verify_password = md5( addslashes( $_POST['verify_password'] ) );
$email = addslashes( $_POST['email'] );

// Kiểm tra 4 thông tin, nếu có bất kỳ thông tin chưa điền thì sẽ báo lỗi
if ( ! $username || ! $password || ! $verify_password || ! $email )
{
print "Xin vui lòng nhập đầy đủ các thông tin. <a href='javascript:history.go(-1)'>Nhấp vào đây để quay trở lại</a>";
exit;
}

// Kiểm tra mật khẩu, bắt buộc mật khẩu nhập lúc đầu và mật khẩu lúc sau phải trùng nhau
if ( $password != $verify_password )
{
print "Mật khẩu không giống nhau, bạn hãy nhập lại mật khẩu. <a href='javascript:history.go(-1)'>Nhấp vào đây để quay trở lại</a>";
exit;
}

// Tiến hành tạo tài khoản
@mysql_query("INSERT INTO members (username, password, email) VALUES ('{$username}', '{$password}', '{$email}')");

// Thông báo hoàn tất việc tạo tài khoản
print "Tài khoản {$username} đã được tạo. <a href='login.php'>Nhấp vào đây để đăng nhập</a>";

}
else
{
// Form đăng ký
print <<<EOF
<form action="register.php?act=do" method="post">
Tên truy nhập: <input type="text" name="username" value="">
Mật khẩu: <input type="password" name="password" value="">
Xác nhận mật khẩu: <input type="password" name="verify_password" value="">
Địa chỉ E-mail: <input type="text" name="email" value="">
<input type="submit" name="submit" value="Đăng ký tài khoản">
</form>
EOF;

}
?>

Thì nó báo lỗi: Parse error: parse error in e:\appserv\www\hoa\register.php on line 34
. Em ko hiểu vì sao nữa. Dòng 34 là dòng print <<<EOF . Có phải là nó ko hiểu dòng đó ko hả các huynh. Lần trước em nhớ cũng dùng câu lệnh print <<<EOF...EOF; và nó cũng báo lỗi tương tự như thế (vẫn chưa giải thích được lỗi đó). Và thực tế em cũng chưa hiểu thật sự nó có ý nghĩa gì? Mong các huynh giải thích giùm em. Thanks. 


Kiểm lại xem sau <<<EOF, và sau EOF; có khoảng trắng (space) nào không, nếu có khi parse sẽ gây ra lỗi trên.
Ref:
http://php.net/heredoc
http://www.php.net/manual/en/function.print.php
[Up] [Print Copy]
[digg] [delicious] [google] [yahoo] [technorati] [reddit] [stumbleupon]
Go to: 
 Users currently in here 
1 Anonymous

Powered by JForum - Extended by HVAOnline
 hvaonline.net  |  hvaforum.net  |  hvazone.net  |  hvanews.net  |  vnhacker.org
1999 - 2013 © v2012|0504|218|