【发布时间】:2011-11-28 23:50:36
【问题描述】:
成功注册的人(输入电子邮件地址,创建密码)会收到一个生成的(因此很难猜到前一个或下一个)唯一 id - 一个从 0 到 N。因此,在成功注册后,我们为每个用户提供了 3 个东西:唯一的电子邮件、密码的哈希值和生成的唯一 ID(0 到 N 之间的整数)。电子邮件、密码哈希和 id 存储在数据库中。
问题是:N 应该有多大,以便猜测有效 id 的概率不超过猜测密码(对于任何给定的电子邮件地址)。 (密码只能包含大写和小写字母、数字、8 个以上的符号,如果这很重要的话。)所以,我想要的只是拥有难以猜到的 id。
假设注册用户不应超过 10,000 个(取决于该数字 N 取决于)。现在至少应该有多少位数字包含一个数字N(0..N 是那个长数字唯一的范围)?
我的算法足够好、公平、糟糕还是非常糟糕? 如果我将此问题发布到错误的线程,请告诉我,以便下次我会没事的。
附:当用户成功登录时,来自 db 的 id 将应用于 SESSION 变量。 所有为用户提取个人数据的 sql 请求,将该 id 与该 SESSION 变量进行比较(所以我们现在要提取谁的数据):
"SELECT ... FROM ... WHERE id='".$_SESSION['id']."'"
谢谢。
【问题讨论】:
-
特定长度是否足以满足安全目的通常无法回答。这取决于它必须有多安全(所以如果数字被猜到,你的系统有多脆弱)以及你能承受多大的数字(为什么让它变得更小(和更不安全)那么有必要?)。尽管从您的描述中我看不出为什么 id 应该是安全的。用户有什么方法可以在会话中放置一个特定的(不是通过正常方式从数据库中检索的)id?如果不是,为什么不采用自动递增的 id?
-
很遗憾,我不是黑客,对网络浏览器漏洞了解不多。这就是我问的原因。您能否确认(非常高级的用户能够更改他的 session_id)的机会为 NULL?你可能是对的,机会是 NULL,但我不知道真正的答案(我是新手)。
-
它几乎可以肯定不是null,但是只要它只存储在db和$_SESSION中,它就不会离开服务器是安全的(假设db和脚本在同一台服务器上) .如果服务器端数据被泄露,让用户 ID 难以猜测似乎很愚蠢,因为让服务器端数据更安全更有意义。但是没有冒犯,在不知道自己在做什么的情况下设计安全系统(我假设登录?)是一个坏主意,所以如果你想构建一个合理的安全系统,我真的建议在尝试之前尽可能多地阅读。
-
你的意思是这样的:devshed.com/c/a/PHP/Creating-a-Secure-PHP-Login-Script-59941(简单而安全的 PHP 登录脚本,包括 cmets),当你说尽可能多地读取气体时?
标签: performance algorithm security validation