PHP URL编码/解码

9
我使用了这个问题中被接受的解决方案,例如在/index.php?id=3中加密id。问题是我无法将加密后的值作为url发送,例如/index.php?id=dsf13f3343f23/23=。因为有时候url中会出现奇怪的字符,比如末尾的=符号。

1
@Michael J.V.:想要编码密钥以阻止人们通过循环遍历ID来爬取我们的数据。这种方法有什么问题?有什么更好的解决方案吗? - Imran Omar Bukhsh
4个回答

21

在传递URL中的数值时,奇怪的字符应该被转义,使用urlencode()函数。


例如,以下代码部分:

echo urlencode('dsf13f3343f23/23=');

将会给你:

dsf13f3343f23%2F23%3D

作为URL参数,这很好用。


如果您想构建带有多个参数的查询字符串,请查看http_build_query()函数。

例如:

echo http_build_query(array(
    'id' => 'dsf13f3343f23/23=',
    'a' => 'plop',
    'b' => '$^@test', 
));

将会给你:

id=dsf13f3343f23%2F23%3D&a=plop&b=%24%5E%40test

这个函数处理参数本身的转义和连接;-)


嘿,Pascal!我可以问你一个简单的问题吗?当我们有一个编码的URL,其中包含像'这样的字符时,它会给我们%27,现在除了%27看起来很丑之外,这些百分比数字是否存在任何安全问题?或者URL编码还有其他问题吗? - Wael Assaf

4

在将值放入URL之前,请使用PHP的urlencode()函数对其进行编码。

string urlencode ( string $str )
当需要编码字符串以在URL的查询部分中使用时,此函数非常方便,是传递变量到下一页的便捷方式。

该函数将“奇怪”的字符(例如=)转换为安全放入URL的格式。您可以像这样使用它:

Header('Location: /index.php?id=' . urlencode($id))

4
如果您使用Base64对二进制值进行编码以用于URL,请注意还有一种包含URL和文件名安全字母表的变体
您可以使用strtr函数将一个字母表翻译为另一个字母表:
$base64url = strtr($base64, '+/', '-_');
$base64 = strtr($base64url, '-_', '+/');

因此,您可以使用这些函数来编码和解码base64url

function base64url_encode($str) {
    return strtr(base64_encode($str), '+/', '-_'));
}
function base64url_decode($base64url) {
    return base64_decode(strtr($base64url, '-_', '+/'));
}

另请参阅我在如何从长的MD5哈希值中生成短的字母数字字符串?上的回答


我已经实现了这个很多次,似乎是最简单的方法(如果你仍然想要走这条路线)。 - TCB13
@Gumbo,你的base64url_encode函数中有一个额外的闭括号。 - PeterA

1

加密参数没有用处。
按原样发送:

/index.php?id=3 

没有任何问题。


除非您使用社会安全号码或类似的东西作为主键。 - vichle
你是否应该将其用作主键? - Your Common Sense
我相信有一些应用程序可能会很有用。 - vichle

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