屏蔽URL参数

时间:2012-02-15 12:11:05

标签: php

我经常想要重定向用户或通过电子邮件向他们发送链接,但我想屏蔽URL中的参数,以便他们无法分辨正在发送的额外信息。

例如,如果我想提供指向http://www.example.com/directory/的链接,但我还想为某人传递电子邮件地址和哈希的额外参数:

电子邮件: someone@example.com

哈希: 22sd359d5823ddg4653dfgfFSG2

我可以将它们发送到此链接,但我不希望他们看到参数:

http://www.example.com/directory/someone%40example.com/22sd359d5823ddg4653dfgfFSG2

所以我的第一个想法就是base64_encode()它,但是你会在最后得到那些额外字节的愚蠢的==符号。而且base64编码也会生成很长的字符串。

对字符串进行编码以隐藏其内容是否有一种更易于使用网址的方式?

你通常会这样做吗? base64_encode()是标准做法吗?

6 个答案:

答案 0 :(得分:2)

您可以生成short id并存储它在数据库中要执行的操作。所以使用

http://www.example.com/directory/K2SP26 
例如,

会将此人的电子邮件地址与他们应该去的地方一起存储在数据库中。查看http://kevin.vanzonneveld.net/techblog/article/create_short_ids_with_php_like_youtube_or_tinyurl/

答案 1 :(得分:1)

可能是一个愚蠢的答案,但为什么不使用mcrypt函数来隐藏你的参数,至少是那些更随意的用户?

答案 2 :(得分:1)

使用类似base64_encode(),gzcompress等来编码字符串不是混淆它的好方法,因为解码它很简单。是的,另一个选择是将值存储在数据库中,并按照人们的建议传递密钥。但假设您不想打扰它,您真正应该做的是使用私钥对其进行实际加密,然后使用相同的密钥在另一端对其进行解密。

例如:

function obfuscateString($s) 
{
    $secretHash = "BA2EC9E717B68176902FF355C23DB6D10D421F93EAF9EE8E74C374A7B0588461";
    return openssl_encrypt($s, 'AES-256-CBC', $secretHash, 0, '1234567890123456');
}

function unobfuscateString($s)
{
    $secretHash = "BA2EC9E717B68176902FF355C23DB6D10D421F93EAF9EE8E74C374A7B0588461";
    return openssl_decrypt($s, 'AES-256-CBC', $secretHash, 0, '1234567890123456');
}

(需要PHP版本> = 5.3.0。)将$ secretHash替换为您自己的秘密十六进制字符串。

注意:初始化向量('1234567890123456')在这个例子中只是一个填充字符串,但没关系。您可以想出一种使用唯一初始化向量的方法,但在大多数情况下,这对于模糊URL参数并不重要。

答案 3 :(得分:-1)

如果您的重定向是由PHP触发的,我认为将数据存储在session中是显而易见的选择。

<?php

function redirectTo($url, $data) {
    session_start();
    $hash = md5(uniqid("rediredt", true));
    $_SESSION[$hash] = array(
        'my' => 'data',
        'is' => 'invisible',
        'to' => 'the user',
    );

    $delim = strpos($url, '?') ? '&' : '?';
    $url .= $delim . 'redirection-key=' . $hash;
    // might want to send 301 / 302 header…
    header('Location: ' . $url);
    exit; // might want to avoid exit if you're running fcgid or similar
}

function isRedirected() {
    if (empty($_GET['redirection-key'])) {
        return null;
    }

    if (!isset($_SESSION[$_GET['redirection-key']])) {
        return array();
    }

    $t = $_SESSION[$_GET['redirection-key']];
    unset($_SESSION[$_GET['redirection-key']]);
    return $t;
}

可能会帮助你掌握这个想法...

答案 4 :(得分:-2)

您有以下两种选择之一:

  1. 电子邮件地址经过哈希处理,因此可以由精明的用户解码 - 或 -
  2. 电子邮件地址存储在您的服务器(数据库)上,电子邮件链接仅包含数据库主ID。
  3. 如果你想要最安全的方法,也提供最漂亮的URL,请使用方法2.如果你绝对不想在你的数据库中存储电子邮件地址,那么要么使用公共哈希,比如base64甚至rot13 ,或自己动手。你会发现滚动你自己并不简单,但它会阻止大多数临时用户试图窥视哈希。

答案 5 :(得分:-5)

它有点hacky,但如果你发送一个包含以下内容的页面

<form id="getme" action="directory/someone" method="POST">
 <input type="hidden" name="email" value="someone@example.com">
</form>
<script> document.getElementById("getme").sumbit();</script>

一旦加载(假设它们启用了javascript),它们就会被重定向到你想要的地方而没有url脏。