在过去的几天里,它一直在我的脑海中运行,但我读了一些关于如何使您的PHP会话更安全的文章。几乎所有这些文章都说,您需要用一个额外的salt来保存会话中的用户代理。如下所示:
$fingerprint = md5('SECRET-SALT'.$_SERVER['HTTP_USER_AGENT']);salt将使攻击者更难劫持或任何会话。但是为什么每次你要像这样检查时都要加盐呢:
md5('SECRET-SALT'.$_SERVER['HTTP_USER_AGENT']) == $_SESSION [ 'fingerprint' ]那么,既然攻击者仍然只需要useragent (相对来说是一小部分不同的useragent)和sessionid,为什么salt会让它更安全呢?
可能有一些我忽略的小东西,但又弄不明白,让我发疯哈哈
谢谢!
发布于 2009-03-05 21:47:35
建议添加盐的原因很简单。通常,当你创建这个“指纹”时--如果你只使用一个数据项,它有一个有限的数据集,那么它使得外部黑客更容易生成它,并劫持会话。
在上面的例子中,是的,如果攻击者同时拥有“指纹”和用户代理,那么他们将能够劫持会话。
添加盐只会使攻击者更难生成指纹,这是一种“如果他们只有一条信息,那么最后一条信息就变得无用”的情况。
例如,我建议您在vBulletin (我曾经参与的一个项目)中添加一些东西,会话ID散列(基本上与指纹相同)是用以下代码生成的。
define('SESSION_IDHASH', md5($_SERVER['HTTP_USER_AGENT'] . $this->fetch_substr_ip($registry->alt_ip))); // this should *never* change during a session此外,还使用以下命令生成会话散列
md5(uniqid(microtime(), true));在尝试标识会话时,这两项都会被选中
因此,要劫持会话,用户需要了解以下内容
他们还必须伪造IP地址(或至少前2/3个二进制八位数)才能做到这一点。
如果他们实际上已经设法获得了上述信息,那么他们很可能能够通过其他方式进行攻击,而不仅仅是会话劫持。
vBulletin本身并不实际使用“盐”,但在上面的示例中,盐只是添加了有限数量的熵,最好总是找到尽可能多的熵。
例如,在我目前正在用python编写的代码中,我生成了一个用于XSRF保护的散列。下面是我所使用的。
self.key = sha1(
self.user.username +
self.user.password +
settings.SECRET_KEY +
strftime("%a, %d %b %Y %H:%M:%S +0000", gmtime())
).hexdigest()它接受用户的用户名和密码、当前时间和一个预设的盐来生成它。对于攻击者来说,由于盐和时间的原因,这将很难生成(但是,请注意,这只是因为它一旦使用就会变得安全,随着时间的推移,如果它不变,那么对于特定用户来说,破解它不会花太多时间)
发布于 2009-03-05 21:50:15
如果我理解正确的话,您想防止会话被猜测会话I的远程攻击者劫持吗?
如果不是这样,那么您就严重超出了您的能力范围--可以窥探流量的攻击者也可以模仿用户代理,而获得对您会话存储的访问权限的攻击者无论如何都会控制您。
如果您存储用户代理字符串以“锁定”到当前用户代理的会话,那么实际上没有必要对其进行散列-对完整的用户代理字符串进行字符串比较会更快(然后进行散列,然后进行比较),并且在存储方面不会显著增加开销。
我不认为存储用户代理可以提供足够的区别--更好的做法是在会话开始时生成一个更大的ID (具有更多的位)(可能是sha1当前时间戳+用户名+用户代理+其他东西),然后将其存储在cookie和会话中,并在每个额外的请求中匹配它。这不会改变攻击向量太多(你仍然需要猜测一些数字),但它很容易通过大量增加攻击的难度来显著增加成功攻击所需的比特数。
更新:
其他答案顺便提到了一些关于加盐哈希的重要内容:仅当您希望攻击者获得对您存储的哈希的访问权限,而不是您的代码,然后以某种方式利用它来利用攻击时,加盐哈希才有意义。
这对于存储了很长时间的密码很有意义,通常存储在一个众所周知的位置,并且由难以定位的代码使用。
这对您的用例没有意义,因为:
简而言之:不要浪费时间编写会话验证代码- PHP内置的会话管理已经足够安全了。
发布于 2009-08-22 02:37:18
如果您在自己的服务器上,加密会话变量是没有意义的,因为它们不会离开服务器。有关更多信息,请参阅 answer to What do I need to store in the php session when user logged in?。如果您在共享服务器中,则可能需要加密除会话ID之外的每个会话变量,因为它们存储在临时文件中,所有邻居都在使用相同的web服务器可读取这些临时文件。
无论如何,如果你真的担心安全性,你最好使用你自己的(虚拟的或非虚拟的)服务器,所以危险只会来自你的服务器之外。
以下是会话风险的一些示例:
所以,根据我通常的偏好,你可以采取一些措施:
PHP
session.use_only_cookies。缺点:用户需要启用cookies。来说微不足道
(我理所当然地认为您已经为PHP配置了最大的安全性)。
一些更极端的措施:
在某些特殊情况下,您可以忘记会话,转而使用Apache身份验证。最简单的解决方案,但有很多限制。
https://stackoverflow.com/questions/616545
复制相似问题