PHP:url编码问题(rawurlencode和rawurldecode)

时间:2011-02-24 02:58:59

标签: php symfony1 urlencode urldecode

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

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

以下是我正在使用的代码片段。我做的任何东西显然都是错的吗?如果不这样做,是否有更好的方法来创建(加密)令牌并将其传递到网址?

<?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是否是所有这些中的罪魁祸首。

1 个答案:

答案 0 :(得分:0)

当您从URL收到令牌时,您不需要rawurldecode令牌,因为PHP会为您处理。例如“foo.php?q = hello%20world”导致$_GET['q']拥有'hello world'而不是'hello%20world'

由于您正在使用ECB模式,因此忽略了IV,这是幸运的,因为您需要使用相同的IV进行加密和解密。

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