如何使用PHP加密URL(或者更确切地说是GET参数部分)?

时间:2012-04-30 07:25:40

标签: php url

我正在开发一个功能,通过我们的应用程序的内置电子邮件发件人,一起发送表单链接,我计划只发送一个包含已发送实体的ID和类型的URL to,表单的id和标识符告诉我在哪个数据库中查找(我们有多个带有客户端数据的数据库)。我正在寻找一种简单的方法来编码这些信息。

我考虑过只发送一个ID并将所有内容保存在数据库中,但由于这些电子邮件可能会被集中发送给市场营销或忠诚活动,我认为这不是一个好主意。

我用Google搜索了一些加密函数,但我尝试过的函数有时会返回带有非法字符的结果,例如“?”和“&”这破坏了我的链接。

4 个答案:

答案 0 :(得分:1)

如果需要加密,请查找AES等对称加密,然后base64对结果进行编码。

如果你只需要编码,然后用Base64编码,这是你最好的镜头。

在这两种情况下都不需要知道某些浏览器URL长度或Web服务器GET支持有限......到一定长度(2000到80000之间,具体取决于浏览器和Web服务器)

还要考虑如何传输链接。很长的URL不方便。您可以非常轻松地安装yourls.org或类似内容来缩短您的网址。

答案 1 :(得分:1)

在我的所有应用程序中,我使用base64_encodebase64_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

在几乎所有情况下,您应该优先使用提供经过身份验证的加密的库,而不是滚动您自己的未经身份验证的加密。