Tôi nghĩ mình đã tìm được giải pháp thông minh!
Ưu điểm của việc này (phức tạp?) Kịch bản:.
- Khi người dùng đăng nhập thành công trong với Ghi nhớ kiểm tra, một cookie đăng nhập được cấp ngoài các quản lý chuẩn của phiên Cookie [2 ]
- Cookie đăng nhập chứa tên người dùng của người dùng, số nhận dạng chuỗi và mã thông báo. Chuỗi và mã thông báo là các số ngẫu nhiên không thể tránh khỏi từ một không gian lớn phù hợp. Cả ba được lưu trữ cùng nhau trong một bảng cơ sở dữ liệu.
- Khi người dùng không đăng nhập truy cập trang web và hiển thị cookie đăng nhập, tên người dùng, chuỗi và mã thông báo được tra cứu trong cơ sở dữ liệu.
- Nếu bộ ba có mặt, người dùng được coi là đã được xác thực. Mã thông báo được sử dụng được xóa khỏi cơ sở dữ liệu. Mã thông báo mới được tạo, được lưu trữ trong cơ sở dữ liệu có tên người dùng và số nhận dạng theo cùng một chuỗi và một cookie đăng nhập mới chứa tất cả ba là cấp cho người dùng.
- Nếu tên người dùng và chuỗi là hiện tại nhưng mã thông báo không khớp, giả định hành vi trộm cắp. Người dùng nhận được cảnh báo mạnh mẽ và tất cả phiên nhớ của người dùng bị xóa .
- Nếu tên người dùng và chuỗi không phải là , cookie đăng nhập sẽ bị bỏ qua.
Tôi đã thực hiện một bảng trong cơ sở dữ liệu với các thông tin sau:
session | token | username | expire
Các nhớ tôi cookie sẽ có thiết lập này:
$value = "$session|$token|$userhash"; //Total length = 106
Session
sẽ là một chuỗi trong số 40 (sha1) ký tự.
Token
sẽ là một chuỗi gồm 32 (md5) ký tự.
Userhash
trong cookie sẽ là chuỗi 32 (md5 tên người dùng) ký tự.
Username
trong cơ sở dữ liệu sẽ là tên người dùng thông thường .
Expire
sẽ hiện là + 60 ngày.
Kịch bản:
if(isset($_SESSION['check']) || $_SESSION['check']){
//User is logged in
}else if(isset($_COOKIE['remember']) && strlen($_COOKIE['remember'])==106){
//THERE is a cookie, which is the right length 40session+32token+32user+2'|'
//Now lets go check it...
conncectdb(); //Sets connection
//How do I protect this script form harmful user input?
$plode = explode('|',$_COOKIE['remember']);
$session = mysql_real_escape_string($plode[0]);
$token = mysql_real_escape_string($plode[1]);
$userhash = mysql_real_escape_string($plode[2]);
$result = mysql_query(" SELECT user
FROM tokens
WHERE session = '$session'
AND token = '$token'
AND md5(user) = '$userhash';")
if(mysql_num_rows($result)==1){
//COOKIE is completely valid!
//Make a new cookie with the same session and another token.
$newusername = mysql_result($result,0,0);
$newsession = $session;
$newtoken = md5(uniqid(rand(), true));
$newuserhash = md5($username);
$value = "$newsession|$newtoken|$newuserhash";
$expire = time()+4184000;
setcookie('remember', $value, $expire, '/', 'www.example.com', isset($_SERVER["HTTPS"]), true);
mysql_query(" UPDATE tokens
SET token='$newtoken', expire='$expire'
WHERE session = '$session'
AND token = '$token'
AND md5(user)='$userhash';");
//Set-up the whole session (with user details from database) etc...
} else if(mysql_num_rows(mysql_query("SELECT user FROM tokens WHERE session = '$session' AND md5(user) = '$userhash';"))==1)){
//TOKEN is different, session is valid
//This user is probably under attack
//Put up a warning, and let the user re-validate (login)
//Remove the whole session (also the other sessions from this user?)
} else {
//Cookie expired in database? Unlikely...
//Invalid in what way?
}
} else {
//No cookie, rest of the script
}
Ưu điểm của kịch bản:
- Nhiều đăng nhập. Bạn có thể tạo các phiên mới cho mỗi máy tính bạn đang sử dụng.
- Cookie và cơ sở dữ liệu sẽ luôn sạch sẽ. Người dùng đang hoạt động gia hạn cookie mỗi lần đăng nhập .
- Kiểm tra phiên tại đầu đảm bảo rằng cơ sở dữ liệu sẽ không nhận yêu cầu vô dụng.
- Nếu kẻ tấn công đánh cắp một cookie, nó nhận mã thông báo mới, chứ không phải phiên mới . Vì vậy, khi người dùng thực sự truy cập trang web có mã thông báo cũ (không hợp lệ) nhưng VỚI người dùng hợp lệ phiên kết hợp người dùng nhận được cảnh báo về hành vi trộm cắp tiềm năng. Sau khi xác thực lại bằng cách đăng nhập vào phiên mới được tạo và phiên lệnh giữ kẻ tấn công không hợp lệ. Việc xác nhận lại đảm bảo nạn nhân thực sự là nạn nhân chứ không phải là kẻ tấn công .
tham khảo: http://jaspan.com/improved_persistent_login_cookie_best_practice
Vui lòng cho chúng tôi biết điều gì đó về ứng dụng của bạn sẽ sử dụng tính năng này. Tác động tiềm tàng của hành vi trộm cắp danh tính/nhận dạng là gì? – Gumbo
hầu hết các máy thay đổi IP mọi lúc ... – Shoe
Tính năng "nhớ tôi" không an toàn theo định nghĩa. Vì vậy, đó là vào bạn để lựa chọn giữa khả năng sử dụng và hoang tưởng. –