PHP中安全、唯一、编码的URL/文件名



我有一个PHP网站,它充当网络代理/匿名器,我设置了它,每个访问的页面都会在有限的时间内缓存在我的服务器上。为了进一步确保安全,我想将URL编码为一组十六进制字符,,但它需要足够唯一,以确保没有两个URL会冲突在一起;缓存页面的文件名将反映编码的URL,所以我不能允许它们被另一个页面的访问覆盖。

与此同时,我一直在使用这个:

$file = str_shuffle(preg_replace("/[^a-zA-Z0-9s]/", "", urlencode($url))) .".html";

但这里的问题是,它总是随机的,不能保证完全唯一。我想让用户可以为他们的URL添加书签(并在给定的时间段内重新访问它们,而不必重新导航到页面)。如何生成这样的字符串?

如果您需要URL的"安全"(如中的不可逆)唯一"编码",这就是哈希的用途:

$hash = sha1('http://...');

每个URL的值都是唯一的,两个相同的URL将散列为相同的值,它们是不可逆的,并且在大多数情况下都是随机值。

如果您谈论的是编码(从一种形式更改为另一种形式)或加密,(使用密钥更改为其他形式),那么您谈论的就是可逆算法,在这种情况下,结果根据定义是唯一的编码字符串不会"安全",因为没有秘密加密字符串与保密一样安全。

所以你有三个选择:

  1. 编码(例如url_encodebase64_encode),不安全且不可逆
  2. 加密(例如AES),它使用秘密并且是安全和可逆的
  3. 散列(例如SHA1),它是不可逆的,因此是安全的

这三个结果都会产生唯一值(好的哈希在数学上有足够高的概率产生唯一值)。

最新更新