使用base64编码的字符串URL

5

可能是重复的问题:
在URL中传递base64编码的字符串

我正在创建一个URL,将其发送给用户。用户然后单击该URL,此URL告诉我用户是谁。

因此,我已使用base64编码将所有数据添加到此链接中。但是,当用户单击链接时,由于编码的URL中有'/',因此他被重定向到404页面,Zend框架路由器找不到任何路由。

有什么办法可以抑制'/'吗?我尝试过htmlentities,但它没有起作用。


/ 替换为不同的字符,例如 !。然后再次执行相反的操作进行解码。请参考 http://en.wikipedia.org/wiki/Base64 - 由于 + 的原因,您可能需要执行类似的操作。您的问题与 Zend 框架无关,因此我已从标题中删除它。在这里还可以找到一些指针:http://www.ruby-forum.com/topic/167232 - hakre
@hakre 我不确定这个问题不能用zend特定的解决方案来解决。如果你告诉路由器接受例如/controller/method/后面的任何内容作为参数,忽略任何特殊字符,它可能会起作用。我没有使用过zend,但这对于大多数其他允许编写自定义路由的框架都适用。 - Jørgen R
@jurgemaister:是的,从技术上讲,我相信你是对的,但不适用于+字符。此外,这可能会破坏相对路径(如果使用)。我建议先将数据制成一个清晰的包,然后再处理它。也许更保守一些。但实际上更安全,而且不需要调整路由的特殊解决方案,只需使用“正常工作”的东西即可。 - hakre
2个回答

3

我强烈推荐使用Joe Riggs' Create URL Safe Encrypted String

提供的代码是过程式的,但非常容易转换为面向对象的。我已经用它来完成你正在做的事情,即对某些信息(通常是用户的电子邮件和ID哈希)进行编码/加密,以便用户点击以激活他们的帐户。

您需要查看的函数是url_base64_decodeurl_base64_encode,其中某些字符被重写为URL安全字符(例如,删除/并将其替换为~)。

[编辑]

这里是基于上述代码的我的类的代码: http://codepad.org/lzevA4k1

用法:

$cryptUtil = new RPK_Crypt();
$string = 'Unencrypted string';
$eString = $cryptUtil->encrypt($string);
$dString = $cryptUtil->decrypt($eString);
var_dump($dString == $string); //true

这是一个可行的路径 https://joe-riggs.com/blog/php-create-url-safe-encrypted-string/ - Dexter

-1

我认为你需要对字符+/=进行URL编码。尝试在Base64编码的参数上使用urlencode()

顺便说一下,这些将是更改:+ => %2B/ => %2F= => %25


404错误提示出现的时间比你能够解码之前要早得多,我想说。 - hakre
@hakre 发送给用户的 URL 需要进行编码。 - Jørgen R
1
如果 base64 字符串是路径的一部分,无论其是否采用三重编码,它都行不通。请参见重复的问题:https://dev59.com/FnM_5IYBdhLWcg3wcSx_。 - hakre

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接