在登录用户之后,我将用户ID保存在cookie中($ _COOKIE [' user_id'])并在此mysql之后检查cookie中是否存在isset user_id以及如果user_id存在于DB中:
SELECT * FROM users WEHERE user_id = '$_COOKIE[user_id]'
它可以工作,但每个cliend都可以更改cookie值,因此客户端可以将cookie user_id设置为1或2,3,4并且它将被loggined,因此它们可以破解页面。
我想以某种方式哈希或保护我的cookie user_id值。我希望你能理解我。 你能给我任何建议吗?
答案 0 :(得分:2)
不要在cookie中这样做。在cookie中保存哈希并将相应的用户ID存储在数据库中。你无法使cookie安全。
更清楚:
当用户登录时,在数据库中为他存储唯一的哈希值。这可能是这样的:sha512('9a7fd98asf'.time().$username)
。这也是您在cookie中保存的值。您知道用户已登录,如果他在数据库中有这样的令牌,并且它是否与cookie中的值匹配。这实际上是会话的处理方式。
答案 1 :(得分:1)
您可以存储名为“user_hash”的其他Cookie:
$_COOKIE['user_hash']=sha1($user_id . md5($user_pass . $salt1) . $salt2);
使用一些常量$ salt值。
使用user_id cookie时,首先检查user_hash是否与数据库中存储的用户登录信息匹配。
由于sha1是不可逆转的,因此无法从中获取密码。
答案 2 :(得分:1)
Cookie容易受到多种类型的攻击,包括有人从一个用户那里窃取cookie并在以后呈现它以模仿该用户。如果您改为使用会话,则必须使用会话cookie或URL,从安全角度来看,这两者都是有问题的。
您可能做的最好的事情就是加密cookie,以便以后在读取user_id时解密它。这将确保用户不能随意更改其user_id。但是,这并不能防止一个用户使用另一个用户的cookie中的数据。
为了防止回复攻击(由同一用户或其他用户),除了存储user_id之外,您还希望将到期时间存储在cookie中。当您取回cookie时,您可以解密并获得所需的时间。这确实意味着在cookie有效的那段时间内可以进行这种类型的重放攻击。
对于加密/解密,您可以使用您使用的语言搜索并查找如何正确执行此操作。您仍然需要针对损坏的cookie进行测试(在这种情况下,您可以假设用户未经过身份验证)。
答案 3 :(得分:0)
您想使用无意义的令牌。这是最安全的方式,因为令牌本质上毫无意义,不能自行攻击。因为令牌还需要与关联数据一起存储在服务器上,这也使服务器能够最终控制登录;因为服务器可以随时撤销活动令牌(您不能撤销仅存储自包含用户ID的cookie)。
标准的PHP会话是一种毫无意义的令牌,对大多数情况来说效果很好。会话甚至可以配置为持续很长时间,您甚至可以将会话存储后端更改为数据库或任何您想要的自定义后端。
无论出于何种原因,如果您需要其他东西,您仍然需要相同的想法: