防止PHP会话劫持,这些好主意吗?

时间:2010-05-26 22:07:01

标签: php session-hijacking

我正在为一个小网站做一个简单的购物车。

我计划在会话变量中存储购物车项目以及登录的user_id。

为了让事情变得更加安全,我想我会这样做:

  1. sha1()将user_id存储在会话中之前。

  2. 同样使用sha1()并将http_user_agent var存储为一些salt,并将其与user_id一起检查。

  3. 我知道还有更多可以做的,但我认为这至少有点帮助吗?并且我很容易实现。

3 个答案:

答案 0 :(得分:3)

我认为你误解了会话劫持的含义。你的第一个想法似乎并没有阻止会话劫持。

当您进行会话劫持时,您正在窃取某人的会话ID并伪装成该会话ID。用户无法更改任何实际会话数据,因此如果您加密/散列任何内容并不重要,因为他们将无法访问它。

您可能要做的是在会话中存储IP和用户代理字符串,并在声明用户登录每个页面加载之前检查它。如果IP和用户代理不匹配,您可能应该提示他们登录。(好吧,至少确保用户代理是相同的)

答案 1 :(得分:1)

  

我认为这至少有点帮助吗?

不是真的。散列user_id不会执行任何操作,因为user_id可能已经是您会话的一部分。

散列IP或UA并要求其匹配是一种弱形式的验证,这也会导致严重的可访问性问题。代理用户每次可能来自不同的地址;用户可能拥有定期更改的动态IP;单个IP可能代表许多实际客户。总而言之,这将导致比解决更多的问题。

在任何情况下,这些都不会对XSRF攻击做任何事情,其中​​IP和UA都将完全匹配。有关抗XSRF策略的一些讨论,请参阅this question

答案 2 :(得分:1)

一般来说,会话​​劫持是指个人试图通过客户端替换数据来尝试访问另一个人的会话的概念。

例如,X人在twitter.com填写登录表。 Twitter.com向人X发送一个cookie。人Y,窥探数据包并手动将该cookie插入其浏览器并访问twitter.com以查明他们已登录。这是会话劫持。

然后会话固定,我给你一个链接http://www.blah.com/?phpsessid=1234,然后祈祷你去那里登录,而不是注意到URL中的PHPsessid。如果您这样做,并且该站点没有重新生成会话ID(因为它总是应该在权限状态更改时),那么黑客现在可以访问blah.com/?phpsessid=1234并且他们将以您身份登录。通过这种方式,他们不必窥探会话ID,因为他们是那些给你的人。

这是一个优秀的网站,提供有关防止基本PHP会话劫持的信息,我相信这可以作为您研究的入门。

http://phpsec.org/projects/guide/4.html