2013-02-20 43 views
0

我正在构建一个网页,其中有网页上的公开内容,但我不希望用户能够通过更改直接在URL中的行的id来猜测下一页是什么。如何在URL中使用字母数字字符串而不是整数?

我发现here,这样做的方式是编码和解码十进制/座36但使用此方法的问题是,id仍然容易被猜到,如1将保持1,和13将是d,等

什么是使用更长的散列/字母数字字符串作为id的最佳做法和方法?有点像YouTube网址,没有任何碰撞的可能性?

感谢您的帮助和建议,非常感谢。

+0

你可以存储预哈希ID字符串作为你的表中的二次“主”键,或者你使用可以使用可逆的加密方法,例如aes-> base64 – 2013-02-20 17:24:03

+0

为你的数字做一个哈希表+添加盐。比较他们,得到原始数字。 – vikingmaster 2013-02-20 17:24:08

+0

您可以从文章/页面的名称创建一个url slug,并将其与数据一起存储在数据库中。这也将使从ID过渡到mod_rewrite seo友好的URL更容易。 – 2013-02-20 17:26:48

回答

1

也许最好的想法是用简单的非线性算法修改散列之前的数字。也许是这样的:

<?php 

$id = ($_GET['id']*3)+2; 

$id = base_convert($id, 10, 36); 

然后到unhash,只是反转算法:

<?php 

$id = dase_convert($id, 36, 10); 

$id = ($id-2)/3; 
+0

到目前为止,这是我最喜欢的解决方案,但我试图确保没有碰撞风险。 – 2013-02-20 17:36:30

+0

唯一真正的风险是有人猜测该模式,并丢失新生成的ID之间的值。例如:1变成5,2变成8,3变成11 – 2013-02-20 17:37:44

+0

如果我转换像1EAFDY(84467302)这样的字符串,PHP处理是否快?对于更长的URL,我会使用'($ id * 1234)+ 2'之类的东西... – 2013-02-20 17:47:30

0

实施使用GUID作为您的身份。

GUID(全局唯一标识符)是128位的值,所以如果你想捕捉某人的ID,你就有猜测的可能。

有许多工具可以生成GUID,VS2010有一个实用程序可以将GUID转换为纯文本格式,但我不知道如何从代码生成,因为我从不需要,只能做到一次性使用。

GUID对身份非常有用。 :)

1

您可以加密/解密您的ID而不是编码。但是,这听起来像你有一系列必须按顺序执行的特定步骤(页面)。

我相信一个更好的方法是让业务类确定用户是否真的被允许(但)看到所请求的页面。这样,您可以使用Url上的ID,但依靠您的代码来确定acccess。

相关问题