Php 在与用户的通信中,用户和电子邮件友好链接

Php 在与用户的通信中,用户和电子邮件友好链接,php,email,cakephp,url-rewriting,Php,Email,Cakephp,Url Rewriting,有时,您需要向用户发送激活链接或指向其配置文件的链接,或指向某些资产的链接,这些资产可能深入到您的应用程序结构或文件夹结构中 诱惑是快速创建如下链接: http://example.com/index.php?controller=users&action=activate&profile_id=123023&token=a2ad2a1adaawda&goto=user_profile 如果在HTML页面上的元素后面显示该链接,则一切正常,但如果需要通过电子邮件将该链接发送给用户,则会遇到一些问

有时,您需要向用户发送激活链接或指向其配置文件的链接,或指向某些资产的链接,这些资产可能深入到您的应用程序结构或文件夹结构中

诱惑是快速创建如下链接:

http://example.com/index.php?controller=users&action=activate&profile_id=123023&token=a2ad2a1adaawda&goto=user_profile

如果在HTML页面上的
元素后面显示该链接,则一切正常,但如果需要通过电子邮件将该链接发送给用户,则会遇到一些问题

如果幸运的话,用户的电子邮件客户端呈现HTML,那么您可以将其隐藏在
后面。否则,您将不得不以纯文本形式发送它,它可能会被分成多行,或者使电子邮件客户端只能部分单击它,这使得用户单击它或在浏览器中复制/粘贴它令人沮丧

有什么解决办法


下面我详细介绍了我最近如何解决这个问题,我也欢迎其他解决方案。

这个问题的答案是用PHP、CakePHP和Apache mod_rewrite编写的,但这里的原则也可以应用于其他web平台

我最后使用的解决方案是利用CakePHP中的路由器(或者如果缺少路由器,则使用mod_rewrite from Apace,通常通过编辑.htaccess文件)

建议:使用短URL

这里的基本原则是在与用户的交流中(特别是在电子邮件中)使用非常短的链接,这些链接看起来很好,并且不超过80个字符(如果可能),以避免包装

因此,与其发送长而难看的URL,不如:

http://example.com/index.php?controller=users&action=activate&profile_id=123023&token=a2ad2a1adaawda&goto=user_profile

发送类似以下内容的邮件:

http://example.com/activate_a2dra2bc430a11af

这要短得多,并且很可能在电子邮件客户端中正确呈现,如果不是很容易复制/粘贴的话

那么我们如何在两者之间来回转换。

解决方案因您选择的平台而异

如果没有路由器实现,则必须依靠
.htaccess
配置将短URL转换为相应的长URL

但是,如果您使用CakePHP之类的工具(或者如果您实现自己的路由器),您将在如何格式化链接方面获得更强大的功能(否则使用Apache的mod_rewrite很难或不可能配置)

以下是我是如何实现它的

首先,我连接了一个路由(
routes.php
),它将拦截我的短激活链接:

Router::connect(“/activate:”令牌“,
数组('controller'=>'users','action'=>'activate'),
数组('pass'=>array('token'),'token'=>'(.*))
);
接下来在我的用户控制器中,我有这个功能(您需要做什么的概述):

公共功能激活($token){
//TODO:1.验证$token具有预期的格式
//TODO:2.执行数据库备份以检查此令牌是否有效
//TODO:3.执行所需操作(如将用户标记为活动)
//TODO:4.如果这是“使用一次”,则从数据库中删除令牌以防止进一步使用链接
//TODO:5.将用户重定向到应用程序中的适当位置
}
以下是控制器操作的简要说明

令牌以前生成为唯一的,并存储到数据库中。根据您的需要,您可以为此使用令牌模型,或者只需在用户表中使用
令牌
列(就像我所做的那样)

步骤1:验证您的令牌。最好确保令牌看起来像令牌。例如,如果您只需要数字或十六进制值,请根据该值进行验证

步骤2:执行db查找以查找包含令牌的行。这将有助于两件事:首先,你将确保这是一个令牌,你已经发出,其次:它还将找到它的链接到用户!(如果已将令牌存储在用户表中或通过联接)

第三步:做你需要做的事。在我的情况下,我已经激活了用户,但你可以做任何事情:重置密码,增加计数器,发送其他通知

步骤4:如果这是一个只能使用一次的链接,那么现在是从DB中删除令牌的好时机。这将确保链接不再工作

步骤5:根据您的操作类型,将用户重定向到应用程序中的正确位置。在我的情况下,请将其添加到用户配置文件

令牌生成

正如我所说的,为了让它起作用,令牌需要是唯一的。有很多方法可以做到这一点,这取决于您的令牌需要有多安全,但在大多数情况下,类似这样的简单方法可以奏效(CakePHP代码):

while(1){
$token=substr(md5(Configure::read('Security.salt').rand(110000.time()),0,16);
//重复,直到我得到一个唯一的令牌。你很可能会从第一次得到一个唯一的令牌!
如果(!token_存在($token)){
打破
}
}
总之

使用这样的令牌:

  • 缩短URL,使其电子邮件和用户友好
  • 增加了一点安全性。猜测一个有效的令牌比摆弄原始长URL中的GET参数要困难得多
  • 这可以很容易地扩展到永久链接和其他操作
我希望你已经发现这个信息丰富且有用,并且它给了你一些想法

参考资料:

  • (感谢您的良好实施!)