1

我正在创建一个令牌,我将其作为页面上 url 的一部分传递。我使用rawurlencode ()对字符串进行编码并将其作为令牌发送,但是,我发现当我解码接收到的令牌(作为 URL 参数传递)时,我得到的字符串略有不同。

我的网址如下所示:/path/to/file.html?token=abcd123

这是我正在使用的代码片段。我在做任何明显错误的事情吗?如果做不到这一点,是否有更好的方法来创建(加密)令牌并将它们传递到 url?

<?php
//send

$raw = "some secret string";
$token = rawurlencode($raw);


//recieve
$data = rawurldecode($token);

?>

[编辑]

我已经删除了 enc(dec)ryption 功能 - 它们不是问题的原因 - 并且是一个红鲱鱼。我已将问题专门缩小到 rawurlencode/decode 在它们的工作方式上不是对称的。

解码时的 rawurlencoded 字符串给出不同的字符串(类似的字符串,但缺少部分)。当然,在 URLS 的基础上不可能有错误——所以我一定做错了什么。问题是我无法发现它,到目前为止似乎也没有其他人能够发现它......

[附加信息]

我正在使用 Symfony Web 框架(v1.3.8),它可能通过在幕后编码和解码东西来弄乱请求。我将尝试直接从 $_POST 变量中获取 token 参数,看看 Symfony 是否是所有这一切的罪魁祸首。

4

1 回答 1

0

当您从 URL 接收令牌时,您不应该需要rawurldecode令牌,因为 PHP 会为您处理。例如 "foo.php?q=hello%20world" 结果是$_GET['q']'hello world' 而不是 'hello%20world'

由于您使用的是 ECB 模式,IV 被忽略,这是幸运的,因为您需要使用相同的 IV 来加密和解密。

至于可能失败的原因 - 解密的字符串将被填充到块大小,因此它可能比原始字符串长。您可以通过传递字符串长度并substr在解密后使用来解决此问题。

于 2011-02-24T03:05:15.723 回答