Php 通过URL传递的盐渍哈希,用于无cookie的持久登录

Php 通过URL传递的盐渍哈希,用于无cookie的持久登录,php,hash,login,Php,Hash,Login,我正在制作一个脚本,其他人将在他们的网站上。它是为对PHP了解有限的人设计的,因此他们所要做的就是包含()脚本并设置一些配置变量。这意味着可能已经发送了头,因此使用会话可能不起作用。我建议他们在自己的脚本中调用session_start,但我也需要一个后备选项 我已经有了一个隐藏的输入来处理表单,但是我还需要链接,以便在它们的URI中附加一个查询字符串来标识会话。但是,如果散列仅基于密码+salt,则存在安全风险:登录的用户可能会单击外部链接,而外部站点的所有者可能会在其引用者日志中看到带有散列

我正在制作一个脚本,其他人将在他们的网站上。它是为对PHP了解有限的人设计的,因此他们所要做的就是包含()脚本并设置一些配置变量。这意味着可能已经发送了头,因此使用会话可能不起作用。我建议他们在自己的脚本中调用session_start,但我也需要一个后备选项

我已经有了一个隐藏的输入来处理表单,但是我还需要链接,以便在它们的URI中附加一个查询字符串来标识会话。但是,如果散列仅基于密码+salt,则存在安全风险:登录的用户可能会单击外部链接,而外部站点的所有者可能会在其引用者日志中看到带有散列的URI。他们所要做的就是使用散列,然后登录


因此,我想以一种时间敏感的方式对散列进行加盐,将会话时间限制为10分钟。我不知道该怎么做。当然,我可以使用time()对其进行加密,但是如何仅根据哈希检查会话的有效期?

这听起来真是个糟糕的主意。而且也很复杂。我绝对不会推荐它。您可能可以使用以下内容:

if (session_id() == "") session_start();
上面将基本检查会话是否已启动,否则将启动会话


由于您计划向用户分发,我觉得整个方法有点不合适。我不确定您希望从中获得什么,但是您可以尝试使用一个JS,它可以在每页调用您的PHP文件。这将使你更容易。如果你能详细说明你正在开发什么样的应用程序,那么我可能会更好地帮助你。我在大众消费软件应用程序方面有很多经验,与您所做的类似。

在10分钟后过期会话并不能保护您的用户免受会话劫持攻击。它只能通过每10分钟强制一次登录来成功骚扰用户。您提出的方案仍然存在各种漏洞。你的加密密码仍然可以通过许多其他渠道泄露给外界;数据包嗅探、中间代理、用户通过电子邮件相互发送指向页面甚至保存的html的链接,仅举几例。我建议您不要在没有成为该领域专家的情况下自行开发安全框架。即便如此,这也是一个已解决的问题。只需使用已知的可信解决方案。web安全中有许多微妙之处很容易搞乱。

这不一定是个坏主意,但如果做得不正确,则很危险。事实上,它是一种相当常见的多域单点登录实现。一些基本规则:

  • 永远不要将密码作为哈希的一部分(即使是salt)
  • 需要生成时间戳作为哈希的一部分,该哈希必须随哈希一起传递
  • 使用此哈希的每个站点都应该有自己的32或64字节guid,用作唯一的salt
  • 在查询字符串中传递特定数据,例如用户名、时间戳、任何其他内容和HMAC。所以它看起来像?user=steve×tamp=66343532233&otherdata=otherdata&HMAC=AB3445-1234144-AFBBDEDD(你明白了)
  • 当跨站点进行站点身份验证时,应使用HTTP_REFERER(如果可能)获取密钥以生成比较HMAC
  • 使用固体散列算法(首选SHA1)生成HMAC。尽可能随机地生成私有站点密钥。不要使用标准的推导方法,只需确保最终结果足够大/足够独特即可

  • 这只是一个简单的建议,但是您是否可以将IP地址包含在密码和salt中?它不会创建依赖时间的散列,但读取日志并能够看到这些散列的人不太可能与合法用户位于同一IP地址,这使得散列对他们来说基本上是无用的。是的,但合法用户的IP可能会有所不同,因为大多数人不会从ISP获得静态IP。谢谢。在我最初的帖子中,我提到如果已经发送了标题(即一些HTML已经输出),会话_start()可能无法工作。尽管如此,我还是找到了一种不需要这些垃圾的方法,只需确保登录表单提交到脚本本身(而不是includer),然后重定向回includer即可使用PHP会话。奥卡姆的剃须刀又开始工作了。我的错,我错过了那部分。无论如何,我希望你做一些有用的事情,包括在这种方式。祝你好运。谢谢,你在一定程度上说服了我放弃这个想法,这个想法现在越来越混乱了。