php - 生成非线性网址

时间:2009-12-06 14:57:53

标签: php

  

更新

     

好的..我已经阅读了很多解决方案......   非常感谢大家。我想我   将保持简单,避免   加密,只依靠两个字段   在数据库中匹配。我可以保留   id是(顺序)但添加   例如一个时间戳(带:   去除)。然后我可以通过   youtube风格的url生成器......   留给我一个非常短暂,独特的   并不容易猜到网址。 e.g

     在youtube url gen blah.com?id=10345&s=134025之前

     

在blah.com?id=H2s&s=tL2s之后

     

我记录每个id的唯一视图......   所以我也会记录不成功的   如果用户点击10不匹配   在一个小时内我会阻止他的   ip(我知道代理会逃避   这......但它让它变得更多   难)。

     

您怎么看?

这可能听起来有点像一个奇怪的问题...我想要实现的是一种生成在网址中使用的id的方法,该ID无法猜测或计算。我的意思是它不是id = 1,id = 2 ......

我正在查看youtube样式脚本here。它有一个填充选项,但填充是如此明显的网址,如wTTTa和b666o。我认为MD5是id ...但是这几乎不是万无一失的,并且需要相当长的网址。

解决方案必须基于网址(不能基于cookie或基于会话)并且在你恐慌之前认为我正在努力找到一种方法来保护我的管理页面 - 我不是,它是游戏的一部分我正在发展。

9 个答案:

答案 0 :(得分:1)

我可能会通过获取时间戳来解决这个问题,然后通过MD5来标记邮票,然后运行substr()来获取最后的4-8个字符(取决于您的偏好)。将生成的ID与已创建的ID(使用简单的MySQL表)进行比较,以保证ID的唯一性。

您可能还希望使用ID或ID的MD5加密时间戳,以进一步提高其唯一性。

答案 1 :(得分:1)

如果您输入id和随机字符串

,该怎么办?
$id = md5( $id . uniqid( mt_rand(), true ) );

这应该让它变得不可思议。

然后检查数据库以查看该ID是否存在。

$db = mysql_connect('localhost', 'username', 'password');
mysql_select_db( 'table' );
$id = 223;

do {

    $unique_id = substr( md5( $id . uniqid( mt_rand(), true ) ), 0, 8 );
    $q = mysql_query( sprintf( "select id from ids where id='%s'", intval($unique_id) ) );
    $c = mysql_num_rows( $q );

} while ( $c > 0 );

echo $unique_id;

这是保证唯一性的唯一方法,同时限制了id

中的字符数

答案 2 :(得分:0)

答案 3 :(得分:0)

只需使用此类中的random(),

https://gallery.svn.sourceforge.net/svnroot/gallery/trunk/eval/gx/kohana/kohana/helpers/text.php

它以不同的格式生成随机字符串。您可以将其用作ID。我在我的网址上使用了这个,

  random('distinct', 10)

答案 4 :(得分:0)

如果你想让它独一无二,我想你将不得不以某种方式对它进行散列。您可以将序列ID与页面的其他标识符连接起来(例如标题)。

答案 5 :(得分:0)

使用slugs怎么样?我们总是用slugs替换ID,所以我们为你的用户和搜索引擎提供了更好的URL,也没有放弃数据库密钥。

slugs是规范化的,并且就像这个问题上的唯一字符串一样:“php-generate-non-linear-urls”

答案 6 :(得分:0)

我不是一个PHP人,但听起来你需要一个随机生成的GUID。

This could help但我不太清楚输出的复杂性。

或者,您可以尝试使用随机字符串生成器,如果PHP有一个,或者您可以使用随机数生成器自行滚动。如果您想100%保证其唯一性,您可能需要一个查找表,或者以毫秒为单位表示当前日期/时间。

答案 7 :(得分:0)

从SugarCRM看一下create_guid()。

它确实创造了独特的id。 它位于include / utils.php(圆线1300)

答案 8 :(得分:0)

你需要生成一个“不可思议的密钥”。如果您生成20个(甚至12个左右)base64个字符的字符,那么对于大多数系统来说应该没问题。

完成基础数学考试,确保您对此感到满意。考虑到64 ^ 20个可能的密钥,黑客有多长时间会偶然发现一个有效密钥?那么,他们每秒可以猜出多少,你会有多少?许多网站都使用此技术来提供网址。

使用这些的一些建议:

  • 我会考虑你是否可以某种方式使这些“临时”。也许他们只需要存在一个月或几个月,然后需要由创作者更新?
  • 我建议您将常规ID保存在数据库中,并将其添加为可以访问记录的第二个密钥。内部使用顺序ID,因为这样很方便,并且在生成和处理URL时只使用不可用的密钥。

您可以使用类似上面链接的内容:

http://www.oreillynet.com/pub/a/php/2002/12/05/one_time_URLs.html

(在Ruby和Java中,有这样的库。我不确定PHP。请参阅http://api.rubyonrails.org/classes/ActiveSupport/SecureRandom.html。)