<分区>
我在 cookie(7 天过期)中使用了 2 个变量,即用户 ID 和哈希值。哈希是用户代理和用户 ID 的 sha1 编码。在这种情况下,一些黑客可以登录知道被盗 cookie 的浏览器。我应该遵循哪种方式或哪种做法最适合记住我的安全问题?
<分区>
我在 cookie(7 天过期)中使用了 2 个变量,即用户 ID 和哈希值。哈希是用户代理和用户 ID 的 sha1 编码。在这种情况下,一些黑客可以登录知道被盗 cookie 的浏览器。我应该遵循哪种方式或哪种做法最适合记住我的安全问题?
最佳答案
虽然您可以对 user_id 和 secret_key 进行哈希处理,但拦截此 cookie 的任何人都可以登录到您的应用程序。除此之外,您还可以让您的记住我的 cookie 很快变质。没有人喜欢陈旧的 cookies 。
您可以将每个用户上次访问的时间戳存储在您的数据库和 cookie 中。每次读取 cookie 以让用户登录时,您都会检查两个时间戳是否匹配。如果他们不这样做,则拒绝用户。如果是,请更新时间戳。
使用这种方法,只要您的用户返回您的网站,所有旧的 cookie 都会过时。拦截了 cookie 的黑客现在拥有一个毫无值(value)的陈旧 cookie,因为他不知道当前 cookie 中的确切时间戳。当然,在用户重新登录之前,黑客可以随心所欲地使用新的 cookie。
//check for cookie
if(isset($_COOKIE['remember_me'])) {
// get hash and time stamp from cookie
$hash = substr($_COOKIE['remember_me'],0,40);
$last_visit = substr($_COOKIE['remember_me'],41);
// query your db with $hash and $last_visit
// if hash and time stamp match up
// log in
// store the current time stamp in a variable to use for both
$time = date("Y-m-d H:i:s");
// update the time stamp in your cookie
$cookie = $pass . "-" . $time;
setcookie('remember_me', $cookie, time()+60*60*24*100, '/');
// update the time_stamp in your database
else {
// remove the remember me cookie
setcookie('remember_me', '', time()-42000, '/')
}
这种方法提供了少量的安全性,当然应该与其他答案中提出的辅助方法一起使用。散列 key 应存储在 cookie 中。记住我的 cookie 不可能绝对安全,因此对于高度敏感的数据或应用程序功能的任何额外访问都应该需要重新输入密码。
我还建议将您的 cookie 命名为“remember_me”以外的名称,以使其更难找到。虽然它不会增加太多安全性(如果有的话),但将您的 cookie 命名为“ht33424”所花费的时间与将其命名为“remember_me”或“hack_me”一样长。
关于php - 记住我功能的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3531377/
相关文章:
java - 无效的记住我 token (系列/ token )不匹配。暗示之前的 cookie 盗窃攻击
php - 当我使用 php 和 html 时,每个单元格都可以编辑吗?
javascript - AngularJS XSRF 策略不支持 cookie 路径
session - symfony2中的Before-Action方法
spring - 在 Spring 3.1 中使用记住我的功能登录用户
php - Codeigniter 和 jquery Ajax
php - 谷歌管理员 SDK : You are not authorized to access this API
javascript - 在Javascript中增加浏览器cookie? (setCookie、getCookie 方法)