一种可以很好地防止猜测ID号的方法是向ID添加某种填充,然后将其转换为base32。当然,这并不能消除完全猜测身份的能力,但对于任何正在窥探的人来说,这确实会让它更费时。
如果有网址www.domain.com/index.php?id_page=1,您可以将ID转换的东西在你的应用程序唯一的,例如:
填充ID = ID×9 - 2
7 = 1 x 9 - 2
16 = 2 x 9 -2
25 = 3 x 9 - 2
然后,你可以转换新的填充ID到基座32,这将是
7 = G4
16 = GE3A
25 = GI2Q
新的URL将被(为1一个id ):
www.domain.com/index.php?id_page = G4
使用这种方法,如果有人猜测1-6的基数32,它将返回404,因为你的ID为1实际上被填充为7,猜测8-15不会返回一个解析的ID,因为2的下一个ID填充为16,依此类推。
这不仅使查询字符串的大小更小,而且它也不使用明显的MD5哈希,它可以非常容易地按字典顺序浏览。
如果您希望将页面链接到特定的用户,那么没有理由不能将更多值添加到新的padded_id(我们称之为散列)。
例如,如果您有一个ID为12的用户,并且您只希望该用户能够访问ID为10的页面,则需要创建一个包含这两个值的散列:
PAGE_ID(10)-user_id(12),使用上述示例中,这将产生:
(10 x 9 - 2) (12 x 9 - 2)
88-106
HA4A-GEYDM
现在具有可以固定到一个单一的用户ID的漂亮的小散列链接。上述示例中的填充方法相当简单,但它提供了如何解决问题的总体思路。
来源
2015-04-07 08:12:16
Amo
他们在查看该页面时是否已登录? – ambe5960
你特别担心什么样的利用/规避? – Harvtronix
@ ambe5960是的,登录过程发生在它们被重定向到相应的页面之前。该过程类似于:登录 - >验证链接是否包含id_page - >如果它确实将用户重定向到相应的页面 –