Chr*_*ris 18 php security cookies obfuscation session
我正在编写一个PHP应用程序.我想将用户登录信息存储在cookie中,这样用户就无需在每次访问时登录.
我想对它们进行编码或对它们进行模糊处理,以便它们不会被读取或篡改.
做这个的最好方式是什么?
更新:
我不打算将密码存储在cookie中,只是一个用户ID,以便我知道它们是谁,但我想要对其进行编码或加密,这样就没有人可以欺骗其他用户
irc*_*ell 52
不要这样做.从长远来看,你会后悔的.当然,你可以加密它,但是当有人找出你的加密密钥时会发生什么.现在你只需将每个人的凭据交给他们(好吧,不是真的,但足够接近).
而不是存储加密的用户名和密码,为什么不创建随机令牌并使用用户名存储?你想要一些相当大的东西,所以像sha256哈希这样的东西就足够了.
$randomToken = hash('sha256',uniq_id(mt_rand(), true).uniq_id(mt_rand(), true));
Run Code Online (Sandbox Code Playgroud)
然后,将其存储在用户旁边的数据库中,并将cookie发送到客户端(我还建议签署令牌以防止篡改:
$randomToken .= ':'.hash_hmac('md5', $randomToken, $serverKey);
Run Code Online (Sandbox Code Playgroud)
现在,当您验证时,首先检查哈希是否匹配:
list($token, $hmac) = explode(':', $_COOKIE['remember_me'], 2);
if ($hmac != hash_hmac('md5', $token, $serverKey)) {
die('tampered token!');
}
Run Code Online (Sandbox Code Playgroud)
从那里,只需通过令牌查找用户.如果找到,请记录该用户.
我还建议在每次更改密码时更改令牌.
注意:请勿在实时生产代码中执行此操作.您永远不能完全信任离开Web服务器的数据.所以不要暴露你的用户信息.这不值得.但是,我确实添加了一些额外的检查(例如签署cookie)以使其更安全,但是你已被警告......
为了对其进行编码,我将使用mcrypt加密数据到cookie中.然后,我会制作一个随机盐并将其与用户行一起存储,然后hash_hmac使用该唯一盐对加密数据进行签名.这样,如果有人拦截了cookie 并找出了密钥的密钥,你仍然可以检测到无效的hmac,这样你就可以找到篡改.
function generateCredentialsCookie($user_id, $password) {
$encrypted = encrypt($user_id.':'.$password, $secretkey);
$salt = uniq_id(mt_rand(), true);
$encrypted .= ':'.hash_hmac('sha256', $encrypted, $salt);
storeSaltForUser($user_id, $salt);
set_cookie('credentials', $encrypted);
}
function readCredentialsCookie() {
$parts = explode(':', $_COOKIE['credentials']);
$salt = array_pop($parts);
$encrypted = implode(':', $parts); //needed incase mcrypt added `:`
$raw = decrypt($encrypted, $secretkey);
list ($user_id, $password) = explode(':', $raw, 2);
if ($salt == getSaltForUser($user_id))
return array($user_id, $password);
} else {
return die('Invalid Cookie Found');
}
}
Run Code Online (Sandbox Code Playgroud)
注意 - 这是伪代码.你需要更多安全(例如检查无效值,确保成功解密等).
您应该将会话过期保持在尽可能低的水平(我通常使用30分钟的会话,但有些网站会更低).到期时间是在最后一次使用之后,因此只要站点被主动使用就无所谓了.
至于为什么不使用长时间运行会话,这里有一些缺点:
DOS(拒绝服务漏洞已创建
磁盘空间 - 每个会话使用相当少的磁盘空间.但是当你有一个长时间运行的会话时,每个新会话只会增加到之前的总数.因此,对于长时间运行的会话,有人只需要使用新的会话ID一遍又一遍地访问您的站点,并且突然间您没有磁盘空间(假设一个理智的磁盘).
文件夹空间 - 每个会话在一个文件夹中占用一个文件.大多数流行的文件系统会因单个文件夹中的大量文件而变慢.因此,如果您放置100万个会话文件,读取或写入会话文件将会很慢(非常慢).垃圾收集(清理旧文件)非常非常慢(如果它甚至可以运行).
会话劫持漏洞被打开.这是因为您在网站上打开的会话越多,就越容易猜出有效的标识符(由于生日攻击).您铺设的会话越少,猜测有效会话就越难.
可能有其他人,但这是一个快速概述.如上所述,使用签名的remember-me令牌而不是长时间运行的会话.你会好得多,而且更安全......
| 归档时间: |
|
| 查看次数: |
11554 次 |
| 最近记录: |