Php 生成私有、唯一、安全的URL
我想生成一个安全的一键访问类型的url,类似于下面的示例。我将使用PHP,但这并不重要,因为我只是想了解基本概念。一些答案建议使用GUID,但我不认为这会给我一个绝对唯一、安全的URL,如下所示Php 生成私有、唯一、安全的URL,php,security,url,Php,Security,Url,我想生成一个安全的一键访问类型的url,类似于下面的示例。我将使用PHP,但这并不重要,因为我只是想了解基本概念。一些答案建议使用GUID,但我不认为这会给我一个绝对唯一、安全的URL,如下所示 # Google Calendar 3qq6jlu04ptlhmb9fencsu5t2k # Private 3qq6jlu04ptlhmb9fencsu5t2k # Private 'token' 163a0afe7fkb1ba2acd04c11ef0eefe8 # LogMe
# Google Calendar
3qq6jlu04ptlhmb9fencsu5t2k
# Private
3qq6jlu04ptlhmb9fencsu5t2k
# Private 'token'
163a0afe7fkb1ba2acd04c11ef0eefe8
# LogMeIn
# 1024 bit - 128 Character URL
72oxuj0fzefqo3fu04xjtvmd0adj2948rfh7g5by4forkwcy7t651z7hcb6kjjgqkxmvmfqpyrcfy15z1fto8ewcxstjc6avicag7d5qnoimsm19kb9kgi9i7v6z01d5
我倾向于128个字符,1024位的样式,因为它看起来非常安全。我想我可以做四个MD5哈希并合并它们,但这真的有效吗
对于这样一个url,我有两个特定的意图,但我相信还有其他人会觉得这很有用 1) 用户的即时登录快捷方式/图标
2) 一次性使用url(密码恢复链接)只需生成一个GUID。重要的是,这不是一个老式的顺序GUID 然而,php似乎没有自己的GUID生成函数。另一个答案中建议的com_create_guid函数似乎仅在php中在Windows上运行时可用 在手册页面上有一个用户建议的非Windows替代方案:
function guid(){
if (function_exists('com_create_guid')){
return com_create_guid();
}else{
mt_srand((double)microtime()*10000);//optional for php 4.2.0 and up.
$charid = strtoupper(md5(uniqid(rand(), true)));
$hyphen = chr(45);// "-"
$uuid = chr(123)// "{"
.substr($charid, 0, 8).$hyphen
.substr($charid, 8, 4).$hyphen
.substr($charid,12, 4).$hyphen
.substr($charid,16, 4).$hyphen
.substr($charid,20,12)
.chr(125);// "}"
return $uuid;
}
}
但我必须承认,我不愿意把它用于任何重要的事情,以防它潜藏着一个不明显的问题,而我没有受过密码训练的头脑没有发现。更新:
对于像一次性URL这样的东西,我会使用建议的GUID式方法。确保链接的使用寿命较短
对于即时登录,没有真正安全的方法来拥有单个URL
是的,你可以生成一个几乎不可能猜到的URL,但这并不能给你带来超级安全性。如果您想记住用户,为什么不使用加密的身份验证cookie呢
举个例子,Google Calendar并不仅仅通过URL登录,在URL有任何意义之前,您必须先通过身份验证
例如,点击我的gmail中的谷歌日历,我会得到:
除非你首先以我的身份进行身份验证,否则这不会帮助你访问我的帐户
旧职位:
您可以在PHP中使用生成GUID并使用它
在linux上,我认为您可以使用以下代码:
尝试-也许可以与md5哈希组合,如示例所示:
// no prefix
// works only in PHP 5 and later versions
$token = md5(uniqid());
// better, difficult to guess
$better_token = md5(uniqid(rand(), true));
但是,我必须注意,以这种方式生成的URL(无论哈希算法如何)都不会是“安全的”,只是很难猜测。id必须是不可能猜测的,GUID是唯一的,但也不难猜测 你需要一个好的随机数生成器,每个加密库至少有一个,我不懂PHP,所以我不能给你函数名 然后你必须决定你的随机数的长度,你应该选择一个足够大的长度,任何猜到一个数字的人都会得到一个未分配的数字-或者:
现在您有了一个“安全”数字,您可以将其转换为十进制、十六进制或base64并使用该字符串。修剪其他花括号
$guid=strtolower(trim(com_create_guid(),“{}”);(PHP 5或更高版本)如果要确保URL是唯一的,并且只能使用有限的次数:
- 保存一个小型数据库,其中包含以下字段:
,RandomKey
,InternalURL
,Counter
TimeStamp
- 从足够大的池中创建一个随机数。
非顺序guid应该足够了 - 将其作为
保存在数据库中,以及系统处理该URL所需的实际内部URL或资源代码和时间戳随机键
- 当用户单击或输入URL时,请对照该数据库检查:如果
太旧或时间戳
太高,请采取适当的措施(例如,如果您希望此URL在有限的时间内或一定的次数内可访问)。计数器
否则,只需使用
处理请求,并将其结果发送回用户InternalURL
- 当URL已被使用或已达到其最大使用计数器时,只需将其从数据库中删除,这样就不能再使用它了
当然,您还必须实施一些安全检查,以限制人们尝试访问无效URL的速率。我避免这样做是因为: 1) 用户的即时登录快捷方式/图标
因为这些URL可以缓存/登录到代理、网络日志、浏览器缓存、书签、电子邮件等上。…为什么?不,说真的,你为什么想要这样的URL?听起来好像你在试图重新发明会话密钥;如果没有更多的上下文,就很难帮助您找到正确的解决方案。我想这是一个安全标签,因为这些URL通常用于立即登录用户或重置其密码。它们不同于会话密钥,因为它们通常只可用于一次操作,而不是像会话id一样可能会挂几个星期。我对这样的url有两个特定的意图,1)用户的即时登录快捷方式/图标2)一次性url(密码恢复链接)为什么不使用cookie进行即时登录?第二个是有意义的。com_create_guid似乎是一个仅适用于Windows的php函数。没错,我目前主要使用ASP.NET,所以我的测试服务器运行Windows,看起来我使用了与您相同的代码进行了更新。+1,UUID是实现这些功能的方法。。几乎和传统的熵一样好,可以为md5播种。为php提供了一些好的(伪)随机数生成器
// no prefix
// works only in PHP 5 and later versions
$token = md5(uniqid());
// better, difficult to guess
$better_token = md5(uniqid(rand(), true));