我正在开发一个功能,通过我们的应用程序的内置电子邮件发件人,一起发送表单链接,我计划只发送一个包含已发送实体的ID和类型的URL to,表单的id和标识符告诉我在哪个数据库中查找(我们有多个带有客户端数据的数据库)。我正在寻找一种简单的方法来编码这些信息。
我考虑过只发送一个ID并将所有内容保存在数据库中,但由于这些电子邮件可能会被集中发送给市场营销或忠诚活动,我认为这不是一个好主意。
我用Google搜索了一些加密函数,但我尝试过的函数有时会返回带有非法字符的结果,例如“?”和“&”这破坏了我的链接。
答案 0 :(得分:1)
如果需要加密,请查找AES等对称加密,然后base64对结果进行编码。
如果你只需要编码,然后用Base64编码,这是你最好的镜头。
在这两种情况下都不需要知道某些浏览器URL长度或Web服务器GET支持有限......到一定长度(2000到80000之间,具体取决于浏览器和Web服务器)
还要考虑如何传输链接。很长的URL不方便。您可以非常轻松地安装yourls.org或类似内容来缩短您的网址。
答案 1 :(得分:1)
在我的所有应用程序中,我使用base64_encode和base64_decode在另一端编码了网址。
我认为这是最佳方式,因为您没有向客户端传输敏感数据。
否则你应该将这些URL保存在数据库中(或者可能是参数)并只发送一个ID
答案 2 :(得分:1)
由于您不希望客户端对信息进行解码,这意味着您不需要完整的URL - 执行的线程必须返回到您的服务器进行处理。在这种情况下,为什么要花费加密费用 - 只需指定一个引用原始id的随机数(检查冲突)。显然,随机数集越稀疏,碰撞的可能性就越小。
答案 3 :(得分:0)
在我自己开发的CMS控制面板中,如果您尝试访问某个网址但未登录,则系统会将您重定向到一个类似于(例如)的网址:/?return=Epf7psjPeRHeEsCoa56xvvF9QiaT%2B02P5FUSbA0Ttl%2Bv3LalZ26sqzSAV6WrNKNWK%2FDD%2FngSbVjJ%2FyUuG9QIWA%3D%3D
成功验证后,您将返回正确的URL。如果你试图篡改这一团数据,那么它将以极大的可能性将你带到主页。
如果这是您正在寻找的内容,我就是这样做的:
if ($_SERVER['REQUEST_URI'] !== '/') {
if (empty($_SESSION['cms_user_id_key_here'])) {
$encrypted = \Defuse\Crypto\Crypto::encrypt(
$_SERVER['REQUEST_URI'],
URL_KEY_CONST
);
header('Location: /?return='.urlencode(base64_encode($encrypted)));
exit;
}
}
然后,成功登录后:
if (isset($_GET['return'])) {
try {
$decrypted = \Defuse\Crypto\Crypto::encrypt(
base64_decode($_GET['return'],
URL_KEY_CONST
);
// Defense-in-depth; we always want a relative URL:
if ($decrypted[0] === '/') {
header('Location: '.$decrypted);
} else {
header('Location: /');
}
} catch (\Defuse\Crypto\Exception\CryptoException $e) {
header('Location: /');
}
exit;
}
你问这个神秘的\Defuse\Crypto\Crypto::encrypt()
和\Defuse\Crypto\Crypto::decrypt()
是什么?它当然是defuse/php-encryption。
在几乎所有情况下,您应该优先使用提供经过身份验证的加密的库,而不是滚动您自己的未经身份验证的加密。