PHP中安全,独特,编码的URL /文件名?

时间:2012-12-12 10:02:26

标签: php url encoding proxy security

我有一个PHP网站充当网络代理/匿名者,我设置了每个访问过的网页在我的服务器上缓存一段时间。为了进一步保护内容,我想将URL编码为一组十六进制字符,但它必须足够独特,以便没有2个URL会发生冲突;缓存页面的文件名将反映编码的URL,因此我不能允许它们被另一个页面的访问覆盖。

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

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

......但问题在于它始终是随机的,并不能保证完全独一无二。我想这样做,以便用户可以为他们的URL添加书签(并在给定的时间段内重新访问它们,而无需重新导航到该页面)。我怎样才能生成这样的字符串?

1 个答案:

答案 0 :(得分:2)

如果你需要一个“安全”,如 not reversible ,一个URL的唯一“编码”,那就是hashes的用途:

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

每个URL的值都是唯一的,两个相同的URL将散列到相同的值,它们不可逆,并且对于大多数意图和目的是随机值。

如果您正在谈论编码(从一种形式更改为另一种形式)或加密(使用密钥更改为另一种形式 ),然后你谈论可逆算法,在这种情况下,结果是定义唯一的。 编码字符串不会是“安全的”,因为没有秘密。 加密字符串与保守秘密一样安全。

所以你有三个选择:

  1. 编码(例如url_encodebase64_encode),这是不安全且可逆的
  2. 加密(例如AES),它使用秘密并且是安全且可逆的
  3. 散列(例如SHA1),这是不可逆的,因此是安全的
  4. 所有这三个都会产生唯一值(良好的哈希值在数学上足够高,可以产生唯一值)。