主页/WordPress笔记/博客文章/综合文章/使用php结合Base64编码与解码来隐藏网站外部URL链接防止被直接爬取的方法

使用php结合Base64编码与解码来隐藏网站外部URL链接防止被直接爬取的方法

本文带你了解使用php结合Base64编码与解码来隐藏网站外部URL链接防止被直接爬取的方法。

比如链接中结尾为 ?ur=aHR0cHM6Ly93d3cuemhhb3poYW8xMjMuY24v 是原始网址经过 Base64 编码后的结果。具体技术实现如下:


关于Base64 编码与解码

1. Base64 编码与解码

  • 编码过程:原始目标网址(如 ` Base64 格式。Base64 是一种将二进制数据编码为 ASCII 字符串的方法,常用于在 URL 或文本中安全传输特殊字符。
  • 解码过程:服务器接收到请求后,会解析 url 参数的值,通过 Base64 解码还原原始 URL。例如,aHR0cHM6Ly93d3cuemhhb3poYW8xMjMuY24v 解码后即为 https://www.zhaozhao123.cn/

2. URL 重定向技术

  • 网站部署了一个重定向服务(例如通过 Nginx、Apache 或自定义脚本)。当用户访问此链接时,服务器会提取 url 参数的值,解码后返回 HTTP 302 状态码,将用户跳转到目标页面。
  • 这种技术常用于 链接跟踪(统计点击量)、隐藏真实 URL(防止被直接爬取或屏蔽)或 简化长链接

3. URL 安全性处理

  • Base64 编码后的字符串可能包含特殊字符(如 +/=),在 URL 中传输时需进一步进行 URL 安全编码(如将 + 替换为 -/ 替换为 _,并去除填充符 =)。但本例中的参数未出现此类替换,说明可能直接使用标准 Base64 编码,由服务器兼容处理。

php代码实现Base64 编码

PHP中将URL进行Base64编码解码的实现方式,php中带有的函数,最简单的方法:

<?php
$url = 'https://www.zhaozhao123.cn/';
$base64 = base64_encode($url);
echo $base64; // 输出:aHR0cHM6Ly93d3cuemhhb3poYW8xMjMuY24v
$url = base64_decode($base64); //输出:https://www.zhaozhao123.cn/

如果需要生成URL安全的Base64编码(替换特殊字符):

<?php
$url = 'https://www.zhaozhao123.cn/';
$base64 = strtr(base64_encode($url), '+/', '-_');
$base64 = rtrim($base64, '='); 
echo $base64; // 输出:aHR0cHM6Ly93d3cuemhhb3poYW8xMjMuY24v

说明:

  1. base64_encode() 是PHP内置的Base64编码函数
  2. 第二个示例通过strtr()替换了+/字符,rtrim()移除了填充的=,使其符合URL安全标准
  3. 两种编码结果相同是因为该URL长度刚好是3的倍数,不需要填充=

注意:Base64编码后的数据体积会比原始数据大33%,建议仅对必要内容进行编码。

URL安全的Base64编码与标准Base64编码主要区别

1. 特殊字符替换
标准Base64中的+/会被替换为-_。这是因为+/在URL中具有特殊含义(如路径分隔符或参数分隔符),可能导致解析错误或需要额外转义。替换后可直接嵌入URL而无需二次编码。

2. 填充字符处理
URL安全编码通常省略末尾的=填充符。标准Base64要求数据长度对齐为4的倍数,不足时用=填充,但URL安全版本常直接去除这些填充符以缩短字符串长度。

3. 应用场景差异

  • 标准Base64:适用于邮件、文本协议传输二进制数据,但直接用于URL时需额外处理特殊字符。
  • URL安全Base64:专为URL设计,如传递令牌、短链等场景,避免因字符冲突导致传输错误。

实现示例(PHP)

function urlSafeBase64Encode($data) {
    return rtrim(strtr(base64_encode($data), '+/', '-_'), '=');
}
// 示例输出:aHR0cHM6Ly93d3cuemhhb3poYW8xMjMuY24v

注意
不同系统对URL安全Base64的实现可能略有差异,例如是否保留=或替换符号不同,需根据具体需求调整。

php编写URL安全的Base64编码与解码实现

以下是经过优化的URL安全Base64编码与解码PHP实现:

1、编码实现

function base64url_encode($data) {
    return rtrim(strtr(base64_encode($data), '+/', '-_'), '=');
}

特点:

  • 使用strtr替换+/字符(比str_replace效率更高)
  • 通过rtrim移除填充的=符号
  • 输出示例:aHR0cHM6Ly9leGFtcGxlLmNvbQ(原数据长度非3倍数时会自动省略=

2、解码实现

function base64url_decode($data) {
    $decoded = strtr($data, '-_', '+/');
    $decoded .= str_repeat('=', 3 - (3 & strlen($decoded)));
    return base64_decode($decoded);
}

特点:

  • 通过位运算3 & strlen快速计算需要补足的=数量(比取模运算更高效)
  • 兼容带/不带=的输入数据
  • 支持还原原始二进制数据(含图片、文件等)

3、完整使用示例

$original = 'https://www.zhaozhao123.cn/';
$encoded = base64url_encode($original);  // aHR0cHM6Ly93d3cuemhhb3poYW8xMjMuY24v
$decoded = base64url_decode($encoded);    // 还原原始URL

4、注意事项

  1. 编码后数据体积增加约33%,建议仅对必要内容编码
  2. 传输敏感数据时建议结合加密算法(如AES)使用
  3. 不同系统对=处理方式可能不同,建议解码时统一补足
  4. 正则验证模式推荐:/^[a-zA-Z0-9_-]{4,}$/(排除非法字符)

使用php结合Base64编码与解码来隐藏网站外部URL链接防止被直接爬取的方法你学会了吗?欢迎关注找找网。