我经常想要重定向用户或通过电子邮件向他们发送链接,但我想屏蔽URL中的参数,以便他们无法分辨正在发送的额外信息。
例如,如果我想提供指向http://www.example.com/directory/的链接,但我还想为某人传递电子邮件地址和哈希的额外参数:
电子邮件: someone@example.com
哈希: 22sd359d5823ddg4653dfgfFSG2
我可以将它们发送到此链接,但我不希望他们看到参数:
http://www.example.com/directory/someone%40example.com/22sd359d5823ddg4653dfgfFSG2
所以我的第一个想法就是base64_encode()
它,但是你会在最后得到那些额外字节的愚蠢的==符号。而且base64编码也会生成很长的字符串。
对字符串进行编码以隐藏其内容是否有一种更易于使用网址的方式?
你通常会这样做吗? base64_encode()是标准做法吗?
答案 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)
您有以下两种选择之一:
如果你想要最安全的方法,也提供最漂亮的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脏。