一个优雅安全的短网址实现原理

   今天收到提(la)醒(ji)短信发现里面有一个短网址,一旦点击即可通过重定向或js跳转到对应的目标页面,那么如何优雅的实现短网址的功能呢,如何保证他的安全性以及可用性呢?把我想到的记录一下,可以一起讨论一下。

实战

这是一条短网址:

http://adkx.net/wd1nv

他本来的地址是:

https://blog.csdn.net/qq_20051535

打开控制台,可以发现它的实现相对简单,采用简单的302跳转形式进行跳转

但是,这种短网址又是怎么生成的,它真的安全吗?

生成方式

  短网址重要在于它短,通常生成方式有三种:Hash法、递增法、随机取值法;如果是我我应该会采用递增加密法。我们逐个说一说:

Hash法

  将网址hash计算,截取其中一部分,如果发生重复则采用其他手段如加1等方式直到没有冲突。

   显然,这是一种效率并不高的查询形式,至少和次序递增相比,但是它具有相对较高的安全性,比如你的网址后缀是 8540b ,即使你非常淘气的尝试输入 8540c、8540d、8540e... 大概率都是找不到页面,这也避免了次序递增可能导致一些重置密码等重要链接被破解。

递增法

  这看起来是最容易实现的方式,我们只需要根据数据库id转化为32位或者36位即可,简单的拼接前面的短网址根域名即可快速生成一个短网址,但是这种方式的安全性是很差的,用户可以轻易地破解大量网址,而这些网址中或许包含重要的信息。

 随机值法

    这个似乎不用我过多解释,简单的获取随机数,之后检查是否已经存在,如果不存在则写入,看起来思路并不复杂,但是实际可能也是比较麻烦的一个过程。

递增加密法

   这仅仅是我想到的一种可以避免次序递增的一种方案,仅供参考!

   我们或许可以根据新插入的id进行变化,比如将数字倒置后进行指定运算后的结果进行进制转换,这样既可以快速插入数据,又可以保证不会出现用户轻易破解的情况。但是值得注意的是,如果加密方式一旦被破解,可能会非常难以处理。

可用性

   短网址我们肯定最希望的就是能顺利地打开页面,如果被人问道如何保证短网址的高可用性,或许大家的答案是:分布式、主从复制、添加缓存Redis等提高性能避免持久层压力等等。但是我想到的第一点是,我们服务正常,但是被即时通讯APP或浏览器拦截应该怎么办,此时我们并不能很好的让用户浏览我们的服务我们又没有办法解决。

    我想到的点有两个:合理经营、AB跳转

    首先,拜托,我们只是考虑误拦截场景,如果网址本身就是一个不正常的页面拦截无可非议,但是经常出现博客链接、APP下载唤醒地址等被拦截,这就很蛋疼。

    根据之前的生活经验,目前比较差的解决方案是引导用户手动打开浏览器进行浏览或跳转APP,当然,有一部分比较优秀的程序会注册类似浏览网页的功能,让微信选择浏览器打开后自动展示软件APP图标,引导用户进行打开。比如:淘宝、叮咚买菜、网易云音乐都实现了以上功能。

    AB跳转也是比较常见的策略,一般在某些APP的H5分享页面、砍价页面等不符合即时通讯APP规定的页面出现。此场景一般采用JS跳转规避应用对于过度重定向检测,跳转的时候会随机跳转到一条目前没有被封禁的链接上,以实现正常浏览,当然,我们必须保证A域名也被经常更换,以避免被封禁。比如早期淘口令采用的网址通常是一串奇怪的网址,好似山寨网站,最近似乎也都换成了tb.cn,或许是考虑了一些本身影响吧。

结语

  好了,今天想到的就这么多。希望对看到的各位有帮助!

   

   

部分参考:javascript如何链接 - 错说 (cuoshuo.com)

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员麻薯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值