【问题标题】:PHP: problems with url encoding (rawurlencode and rawurldecode)PHP:url 编码问题(rawurlencode 和 rawurldecode)
【发布时间】:2011-02-24 02:58:59
【问题描述】:

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

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

这是我正在使用的代码的 sn-p。我在做任何明显错误的事情吗?如果做不到这一点,是否有更好的方法来创建(加密)令牌并将它们传递到 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 是否是所有这一切的罪魁祸首。

【问题讨论】:

  • 好的,我解决了这个问题。这实际上是我最后造成的一个问题。在调用 rawurlencode() 之前发生错误。

标签: php symfony1 urlencode urldecode


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 2010-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-20
    相关资源
    最近更新 更多