1.背景介绍
相信很多人手机上都收到过一些营销短信,短信里面有时候会附带一些网址,如下图
这些网址往往都是非常短,但是当我们打开之后,如果你仔细观察,中间会有跳转,最终浏览器地址栏显示的网址并不是你短信里面看到的网址,这就是短网址!
2.原理和应用
短网址一般是采用一个非常短域名下,路径参数一般只有3-6个字符组成,非常简洁!
使用短网址的前提是先生成短网址,主要是采用某种算法让一段短的字符对应一个长的字符,比如说从常用的0-9、a-z、A-Z共62个字符中选择6个字符,那意味着有62的6次方种组合,大概有568亿不重复的短网址可用!
服务器通过路径参数查询到真实的长网址,然后使用301/302跳转到真实的网址即可!
关于跳转,301 是永久重定向,302 是临时重定向。短地址一经生成就不会变化,所以用 301 是符合 http 语义的,浏览器会记录跳转地址,同时对服务器压力也会有一定减少。但是如果使用了 301,我们就无法统计到短地址被点击的次数了,如果对数据统计有要求的话,使用302跳转可能比较好一些!
短网址的主要好处是方便传输记忆,特别是在短信里面使用的时候,短信对内容字数有限制,还有比如说微博分享也使用了短网址!
3.市面现有案例
目前市面上有很多免费的短链接服务,功能基本上都一样,也没有什么限制!
(1)百度的短链接(dwz.cn/),百度不仅仅提供了网页入口,也提供了接口和开发文档,简单易用!
(2)新浪的短链接(sina.lt/),目前仅提供网页入口,未发现接口服务!
(3)淘宝的短链接(tb.am/),目前仅提供网页入口,未发现接口服务!
市面还有很多其它的小的公司提供短链接服务,有些是部分免费,有些短链接是有效期的,这里不一一介绍!
4.常用算法
网上比较流行的算法有进制算法、摘要(Hash)算法、随机数算法,下面简单介绍一下:
一.进制算法
这个算法网上也有叫作自增序列算法,特点就是永不重复,设置 id 自增,一个 10进制 id 对应一个62进制的数值,1对1,也就不会出现重复的情况,这个利用的就是低进制转化为高进制时,字符数会减少的特性。
计算机中常见的进制有2进制,8进制,10进制,16进制,进制越大,能够表示的数越大,占用的字数也越少。下面举个例:
10进制的1000,在8进制里面是1750,在16进制里面就是3E8,那在62进制里面呢?有人说,计算机里面没有62进制。。。虽然没有,但是我们可以造一个,进制的转换算法是固定的,最常见的就是“除基取余法”!
我们假设62进制的字符序列为 0-9a-zA-Z,顺序可以打乱,但是应该固定下来,是一个从0角标开始的到61的数组,我们暂且称之为字母表!
====> 1000/62 = 16,余8
====> 16/62 = 0,余16
余数得到的数字是16、8,然后找到字母表里面角标为16和8的字符拼起来,就是g8,非常短,只有2位数!假如说我们想至少产生6位字符,那么我们可以从一个比较大的数字开始,具体可以看下图:
1位 62 0 - 61 2位 3844 62 - 3843 3位 约 23万 3844 - 238327 4位 约 1400万 238328 - 14776335 5位 约 9.1亿 14776336 - 916132831 6位 约 568亿 916132832 - 56800235583 复制代码
二.Hash算法
第一种方式:
简单的对长链接进行加盐md5,会生成一个32位的字符串,随机从里面取6个字符,或者简单粗暴取最后6位,但是md5只包含0-9A-Fa-f,比字母表的里面字符还少,冲突几率更大!
第二种方式:
1.将长网址 md5 生成 32 位签名串,分为 4 段, 每段 8 个字节
2.对这四段循环处理, 取 8 个字节, 将他看成 16 进制串与 0x3fffffff(30位1) 与操作, 即超过 30 位的忽略处理
3.这 30 位分成 6 段, 每 5 位的数字作为字母表的索引取得特定字符, 依次进行获得 6 位字符串
4.总的 md5 串可以获得 4 个 6 位串,取里面的任意一个就可作为这个长 url 的短 url 地址
生成的方式更加复杂,重复的几率低,但是依然会出现冲突!
三.随机数算法
这个更简单,直接对这个62个字符数组做随机选择,选择其中6个字符当作短链接码,简单易用,但是难免会出现重复冲突!
四.算法对比
第一种算法只要解决自增id问题就可以避免冲突,自增id可以采用数据库自增主键,每次生成短码只需一次数据库操作(insert操作,获取主键id,然后算出短码即可)
第二种和第三种算法其实都差不多,都是依赖于程序随机,容易出现冲突,这就需要每次在插入数据库的时候判重,效率低一些!
5.安全
短链接虽然方便了传输和记忆,但是由于链接组成的字符个数少,更容易被爆破、猜测攻击,攻击者可以轻松遍历所有字符组成的链接!
所以不建议使用短链接发送具有私密性的网址,比如说重置密码链接,对一些权限、敏感信息的链接要做好二次鉴权!
推荐教程:Laravel实战开发短链生成器视频教程
以上是PHP如何实现短网址的详细内容。更多信息请关注PHP中文网其他相关文章!

在PHP中,可以使用session_status()或session_id()来检查会话是否已启动。1)使用session_status()函数,如果返回PHP_SESSION_ACTIVE,则会话已启动。2)使用session_id()函数,如果返回非空字符串,则会话已启动。这两种方法都能有效地检查会话状态,选择使用哪种方法取决于PHP版本和个人偏好。

sessionsarevitalinwebapplications,尤其是在commercePlatform之前。

在PHP中管理并发会话访问可以通过以下方法:1.使用数据库存储会话数据,2.采用Redis或Memcached,3.实施会话锁定策略。这些方法有助于确保数据一致性和提高并发性能。

PHPsessionshaveseverallimitations:1)Storageconstraintscanleadtoperformanceissues;2)Securityvulnerabilitieslikesessionfixationattacksexist;3)Scalabilityischallengingduetoserver-specificstorage;4)Sessionexpirationmanagementcanbeproblematic;5)Datapersis

负载均衡会影响会话管理,但可以通过会话复制、会话粘性和集中式会话存储解决。1.会话复制在服务器间复制会话数据。2.会话粘性将用户请求定向到同一服务器。3.集中式会话存储使用独立服务器如Redis存储会话数据,确保数据共享。

Sessionlockingisatechniqueusedtoensureauser'ssessionremainsexclusivetooneuseratatime.Itiscrucialforpreventingdatacorruptionandsecuritybreachesinmulti-userapplications.Sessionlockingisimplementedusingserver-sidelockingmechanisms,suchasReentrantLockinJ

PHP会话的替代方案包括Cookies、Token-basedAuthentication、Database-basedSessions和Redis/Memcached。1.Cookies通过在客户端存储数据来管理会话,简单但安全性低。2.Token-basedAuthentication使用令牌验证用户,安全性高但需额外逻辑。3.Database-basedSessions将数据存储在数据库中,扩展性好但可能影响性能。4.Redis/Memcached使用分布式缓存提高性能和扩展性,但需额外配

Sessionhijacking是指攻击者通过获取用户的sessionID来冒充用户。防范方法包括:1)使用HTTPS加密通信;2)验证sessionID的来源;3)使用安全的sessionID生成算法;4)定期更新sessionID。


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

DVWA
Damn Vulnerable Web App (DVWA) 是一个PHP/MySQL的Web应用程序,非常容易受到攻击。它的主要目标是成为安全专业人员在合法环境中测试自己的技能和工具的辅助工具,帮助Web开发人员更好地理解保护Web应用程序的过程,并帮助教师/学生在课堂环境中教授/学习Web应用程序安全。DVWA的目标是通过简单直接的界面练习一些最常见的Web漏洞,难度各不相同。请注意,该软件中

VSCode Windows 64位 下载
微软推出的免费、功能强大的一款IDE编辑器

SublimeText3汉化版
中文版,非常好用

SecLists
SecLists是最终安全测试人员的伙伴。它是一个包含各种类型列表的集合,这些列表在安全评估过程中经常使用,都在一个地方。SecLists通过方便地提供安全测试人员可能需要的所有列表,帮助提高安全测试的效率和生产力。列表类型包括用户名、密码、URL、模糊测试有效载荷、敏感数据模式、Web shell等等。测试人员只需将此存储库拉到新的测试机上,他就可以访问到所需的每种类型的列表。

mPDF
mPDF是一个PHP库,可以从UTF-8编码的HTML生成PDF文件。原作者Ian Back编写mPDF以从他的网站上“即时”输出PDF文件,并处理不同的语言。与原始脚本如HTML2FPDF相比,它的速度较慢,并且在使用Unicode字体时生成的文件较大,但支持CSS样式等,并进行了大量增强。支持几乎所有语言,包括RTL(阿拉伯语和希伯来语)和CJK(中日韩)。支持嵌套的块级元素(如P、DIV),