【问题标题】:Masking URL parameters屏蔽 URL 参数
【发布时间】:2014-08-07 23:50:35
【问题描述】:

我经常想重定向用户或通过电子邮件向他们发送链接,但我想屏蔽 URL 中的参数,这样他们就无法知道正在发送哪些额外信息。

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

电子邮件:someone@example.com

哈希: 22sd359d5823ddg4653dfgfFSG2

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

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

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

是否有更简单、对 URL 友好的方式来对字符串进行编码以隐藏其内容?

你通常会怎么做? base64_encode() 是标准做法吗?

【问题讨论】:

  • I don't want... 请问-为什么?
  • 最后的==有什么问题?
  • @Phil == 似乎有点太明显了,它已经被base64编码了。更重要的是,当您在纯文本电子邮件中发送此类链接时,== 不被视为链接的一部分(至少在 Outlook 中没有,我尚未在其他电子邮件客户端中测试过)。所以你有一个蓝色链接,最后是黑色的 ==。
  • 当然这是一个真正的问题。就因为看不懂就想关掉?我想屏蔽链接中的 URL 参数。有什么难理解的?
  • @Shrapnel:这对我来说似乎是一个有效的问题。我还可以为这样的系统设计非恶意用途。

标签: php


【解决方案1】:

您可以生成一个short id 并将它应该做的事情存储在数据库中。所以使用

http://www.example.com/directory/K2SP26 

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

【讨论】:

  • 是的,我明白你的意思,但这太过分了。可能有数百万个这样的链接,而且我也不想每次只想重定向到新链接时都更新数据库。
  • 用户是否应该在一定的时间范围内访问该页面?也许通过删除超过 6 个月的记录进行一些清理,甚至在记录上设置过期日期。适当的索引和清理应该使这项工作。如果您使用哈希,您最终将不得不对其进行解码......我想知道资源的差异是什么。
【解决方案2】:

使用 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】:

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

    【讨论】:

      【解决方案4】:

      如果您的重定向是由 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;
      }
      

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

      【讨论】:

      • 没关系……我没有看到»给他们发链接«的部分。如果这是基本想法,请遵循@Aaron 的想法。这是真正向用户隐藏数据的唯一解决方案。如果我看到 base64 编码的数据,我会出于好奇对其进行解码 - 任何人都可以。
      【解决方案5】:

      您有以下两种选择之一:

      1. 电子邮件地址经过哈希处理,因此可以由精明的用户解码。
        - 或 -
      2. 电子邮件地址存储在您的服务器(数据库)中,电子邮件链接仅包含数据库主 ID。

      如果您想要最安全的方法,也可以提供最漂亮的 URL,请使用方法 2。如果您绝对不想将电子邮件地址存储在数据库中,请使用通用哈希,例如 base64 甚至 rot13 ,或自己滚动。你会发现自己滚动并不简单,它会阻止大多数普通用户试图窥探哈希。

      【讨论】:

        【解决方案6】:

        这有点老套,但如果你给他们发送一个包含以下内容的页面:

        <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 脏乱。

        【讨论】:

        • 请不要将丑陋的解决方案称为“hacky”。更不用说问题的电子邮件部分了
        • 对不起,这是一个非常糟糕的解决方案。
        • 我认为“hacky”是将技术用于其他目的而不是设计目的的行为? ...我知道我的回答没有解决电子邮件问题,但我认为值得一提。对于我自己的学习,你能为我解释一下丑陋与骇人听闻吗?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-02-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-23
        • 1970-01-01
        相关资源
        最近更新 更多