针对黑客的 Cookie 完整性
Integrity of Cookies against Hackers
我正在尝试开发一个 PHP 可以使用 cookie 启动安全登录的登录脚本。我知道您可以使用计算机做很多事情,我正在向社区询问有关 cookie 安全性的信息。我最大的问题:有人可以创建 cookie 来欺骗帐户并在不登录的情况下访问该站点吗?检查此用户是否合法的最安全方法是什么?
Cookie 是浏览器存储的,所以是的,它们可以创建 cookie。你通常做的是为 user id
设置一个 cookie,为 session hash
设置另一个 cookie(你在用户登录时随机生成的东西)并检查会话 IP。
在我看来,在会话上使用 cookie 更安全,因为在其基础上,会话标识符也存储在 cookie 或 http 请求中,这更容易发生会话劫持。根据要求,我通常采用的方式是将所有用户标识符存储在一个 cookie 中。类似于:ID:PUBLIC_KEY:USER_DATA_SESSION_HASH_VERIFIER
。其中:
ID
是用户id。
PUBLIC_KEY
是存储在数据库中的随机字符串,如果您在每次登录时重新生成它,可以进一步保护它,同时请记住,它将取消验证来自其他设备、浏览器的所有登录。所以基本上你一次只能从一个地方登录。
USER_DATA_SESSION_HASH_VERIFIER
是由用户id、用户代理、当前ip地址、public密钥、私钥组成的散列,中间夹杂盐(tokens),多次md5和sha1混合使用最终的 sha1 或 sha256 哈希。
所以使用 ID
和 PUBLIC_KEY
我 select 用户和一些数据,比如私钥,重新生成哈希,并将其与 USER_DATA_SESSION_HASH_VERIFIER
.请记住,如果用户重新启动互联网连接,那么在哈希中包含当前 ip 将使用动态 ip 注销用户,这将有一个新的 ip 地址。在哈希中混合用户代理将防止其他用户在不同的浏览器上使用您的 cookie。
现在,如果您正在寻找像 facebook 这样的用户的会话管理之类的东西,那么您可以在其中混合会话标识符,并将会话标识符与您唯一的 public 密钥存储在数据库中的会话中.
例如。 1:asdfg:uss32:sha1_hash 1:GGGAS:2312:sha1_hash。这样你就不能在会话 2312.
中使用 asdfg 密钥
可能还有其他更好的做法,但目前对我来说这似乎是一个很好的解决方案。
我正在尝试开发一个 PHP 可以使用 cookie 启动安全登录的登录脚本。我知道您可以使用计算机做很多事情,我正在向社区询问有关 cookie 安全性的信息。我最大的问题:有人可以创建 cookie 来欺骗帐户并在不登录的情况下访问该站点吗?检查此用户是否合法的最安全方法是什么?
Cookie 是浏览器存储的,所以是的,它们可以创建 cookie。你通常做的是为 user id
设置一个 cookie,为 session hash
设置另一个 cookie(你在用户登录时随机生成的东西)并检查会话 IP。
在我看来,在会话上使用 cookie 更安全,因为在其基础上,会话标识符也存储在 cookie 或 http 请求中,这更容易发生会话劫持。根据要求,我通常采用的方式是将所有用户标识符存储在一个 cookie 中。类似于:ID:PUBLIC_KEY:USER_DATA_SESSION_HASH_VERIFIER
。其中:
ID
是用户id。
PUBLIC_KEY
是存储在数据库中的随机字符串,如果您在每次登录时重新生成它,可以进一步保护它,同时请记住,它将取消验证来自其他设备、浏览器的所有登录。所以基本上你一次只能从一个地方登录。
USER_DATA_SESSION_HASH_VERIFIER
是由用户id、用户代理、当前ip地址、public密钥、私钥组成的散列,中间夹杂盐(tokens),多次md5和sha1混合使用最终的 sha1 或 sha256 哈希。
所以使用 ID
和 PUBLIC_KEY
我 select 用户和一些数据,比如私钥,重新生成哈希,并将其与 USER_DATA_SESSION_HASH_VERIFIER
.请记住,如果用户重新启动互联网连接,那么在哈希中包含当前 ip 将使用动态 ip 注销用户,这将有一个新的 ip 地址。在哈希中混合用户代理将防止其他用户在不同的浏览器上使用您的 cookie。
现在,如果您正在寻找像 facebook 这样的用户的会话管理之类的东西,那么您可以在其中混合会话标识符,并将会话标识符与您唯一的 public 密钥存储在数据库中的会话中.
例如。 1:asdfg:uss32:sha1_hash 1:GGGAS:2312:sha1_hash。这样你就不能在会话 2312.
中使用 asdfg 密钥可能还有其他更好的做法,但目前对我来说这似乎是一个很好的解决方案。