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 bảo mật Cách thức kiểm tra đăng nhập an toàn  XML
  [Question]   Cách thức kiểm tra đăng nhập an toàn 20/07/2006 06:24:39 (+0700) | #1 | 8147
[Avatar]
Vickizw
Member

[Minus]    0    [Plus]
Joined: 06/07/2006 19:55:29
Messages: 339
Location: ColTech
Offline
[Profile] [PM] [WWW]
Cách thức kiểm tra thông tin đăng nhập an toàn

Thông thường khi viết một portal hay forum hay là một sản phẩm nào đó có chức năng đăng nhập dành cho thành viên thì đôi khi việc kiểm tra thông tin đăng nhập lại hết sức cần thiết. Nếu nói về những người dùng hợp lệ (tức là đăng nhập bằng chính tài khoản của họ) thì không phải bàn tới, tuy nhiên trong số đó cũng có người ngoại lệ (tức là đăng nhập trái phép)... cách thức họ dùng để đăng nhập trái phép cũng không bàn tới vì sau khi áp dụng bài viết này thì dù họ có trái phép thì ta cũng có thể bắt buộc họ phải đăng nhập một cách hợp lệ.

Trước hết khi kiểm tra thông tin đăng nhập thì yêu cầu có là một form đăng nhập bao gồm: username và password. Và trong đó có 2 trường hợp kiểm tra thông tin đăng nhập:

1. [SELECT * FROM users WHERE name='$username' AND password='$password']
2. [SELECT * FROM users WHERE name='$username'] 


Trong trường hợp thứ 1 có thể khẳng định là coder này rất ẩu :d, còn trong trường hợp 2 thì hoàn toàn đúng.

Tại sao trường hợp thứ 1 lại gọi là rất ẩu !? Câu trả lời rất đơn giản, nếu đọc câu lệnh SQL này ra thì có thể đọc là: lấy từ table users nơi có $username và $password - rất có thể sẽ dính by pass ( ' OR '1'='1 ), nếu đăng nhập trái phép theo dạng này thì câu lệnh sẽ trở thành: SELECT * FROM users WHERE name='$username' AND password='' OR '1'='1' - Câu lệnh này cũng sẽ hợp lệ vì cuối cùng khai báo là OR '1'='1' (1 = 1 smilie)

Tuy nhiên đây chỉ là một trường hợp tham khảo vì nếu biến $password được lọc kỹ thì cũng sẽ vẫn dùng được nhưng để an toàn hơn ta nên hạn chế tối đa các biến cần kiểm tra, vì vậy sẽ dùng trường hợp thứ 2, như thế chỉ còn 1 biến duy nhất cần kiểm tra là $name.

Trong số hàm có khả năng lọc thì L khuyên nên sử dụng hàm addslashes(), cú pháp của hàm này là:

addslashes( string )


Ví dụ:

Code:
<?php

$string = " ' OR '1'='1' ";
echo addslashes( $string ); // Kết quả trả về là: ' OR '1'='1'

?>



Ở trên cũng chưa chắc an toàn vì biến $string này chỉ mới được addslashes() lọc nhưng điểm quan trọng là biến $string này vẫn là: ' OR '1'='1' vì chưa có dòng nào khai báo $string = addslashes( $string ) cả. Vì thế ở trước câu lệnh của trường hợp 2 phải khai báo là: $username = addslashes( $username ). Sau đó sẽ bao gồm 2 bước kiểm tra cuối cùng là: Kiểm tra username này có tồn tại hay không, Nếu tồn tại thì tiếp tục Kiểm tra password của username này có đúng hay không.

PS: Khi bạn muốn lấy thông tin từ form thì bạn nên để method = post, vì sao thì bạn tự tìm hiểu.

Để dễ hiểu L tổng hợp lại từ đầu đến cuối có code hoàn chỉnh như sau: (Ngoại trừ table users tee-hee)

Code:
<?php

$username = $_POST['username'];
$username= addslashes( $username);

$query = mysql_query("SELECT * FROM users WHERE name='$name'");
$result = mysql_fetch_array( $query );

// Kiểm tra username này có tồn tại hay không
if ( mysql_num_rows( $query ) == 0 )
{
print "Username không tồn tại!";
}

// Kiểm tra password của username này có đúng hay không
if ( $password != $result['password'] )
{
print "Mật khẩu không đúng!";
}

print "Congratulations :d":

?>


------------------------------------
nguồn : sanchoituoitre.info
[Up] [Print Copy]
  [Question]   Cách thức kiểm tra đăng nhập an toàn 20/07/2006 06:29:46 (+0700) | #2 | 8153
[Avatar]
KINYO
Member

[Minus]    0    [Plus]
Joined: 30/06/2006 19:10:11
Messages: 272
Location: localhost
Offline
[Profile] [PM] [WWW]

Vickizw wrote:

Code:
<?php

$username = $_POST['username'];
$username= addslashes( $username);

?>

 


Tại sao lại tốn hai dòng cho một việc rất đơn giản ? Sao không viết như sau ?

Code:
<?php

$username= addslashes( $_POST['username'] );

?>

 
[Up] [Print Copy]
  [Question]   Cách thức kiểm tra đăng nhập an toàn 20/07/2006 06:59:47 (+0700) | #3 | 8166
thang2rs
Member

[Minus]    0    [Plus]
Joined: 06/07/2006 18:45:35
Messages: 46
Offline
[Profile] [PM]
Tôi dùng:

if (get_magic_quotes_gpc()) {
$user=stripslashes($_POST['user']);
$pass=stripslashes($_POST['pass']);
} else {
$user=$_POST['user'];
$pass=$_POST['pass'];
}

$user=mysql_real_escape_string($user);
$pass=mysql_real_escape_string($pass);

$query="S ELECT * FROM user WHERE name='$user' AND pass='$pass'";

[Up] [Print Copy]
  [Question]   Cách thức kiểm tra đăng nhập an toàn 20/07/2006 10:53:26 (+0700) | #4 | 8237
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!]
mình không hiểu sâu PHP cho lắm, nên đề nghị bạn thang2rs giải thích rõ những câu lệnh trên.
[Up] [Print Copy]
  [Question]   Cách thức kiểm tra đăng nhập an toàn 20/07/2006 11:15:22 (+0700) | #5 | 8241
[Avatar]
phamquoc_truong
Elite Member

[Minus]    0    [Plus]
Joined: 04/04/2004 07:54:12
Messages: 79
Location: PeaceWorld
Offline
[Profile] [PM]
Copy right nghe đồn ở bài này chưa có à nha ! smilie
[Up] [Print Copy]
  [Question]   Cách thức kiểm tra đăng nhập an toàn 20/07/2006 11:35:20 (+0700) | #6 | 8247
lyhuuloi
Elite Member

[Minus]    0    [Plus]
Joined: 04/04/2003 11:29:17
Messages: 90
Location: TP HCM
Offline
[Profile] [PM] [Email] [WWW] [Yahoo!]
Bạn có thể xem bài viết gốc của mình tại đây:
http://sanchoituoitre.info/topic/178/
http://lyhuuloi.com smilie
[Up] [Print Copy]
  [Question]   Re: Cách thức kiểm tra đăng nhập an toàn 20/07/2006 21:48:56 (+0700) | #7 | 8300
thang2rs
Member

[Minus]    0    [Plus]
Joined: 06/07/2006 18:45:35
Messages: 46
Offline
[Profile] [PM]
To Mr An Luong:

Đã giải thích rất rõ tại /hvaonline/posts/list/819.html
[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|