首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

  • 24-12-06 00:25
  • 3285
  • 79635
juejin.cn

在开发 API 时,我们经常会面临爬虫滥用的问题。一旦接口被爬虫识别并解析,敏感数据可能会被恶意获取,这不仅损害了系统的性能,还可能涉及数据泄露。今天我们就来聊聊如何设计一个加密算法,提升爬虫爬取的难度,从而保护接口安全。


爬虫的常见手段

  1. 直接抓包:通过工具(如 Postman、Fiddler)直接分析 API。
  2. 模拟用户请求:伪造 HTTP 请求头,模仿真实用户的行为。
  3. 解密传输数据:如果数据没有经过加密,爬虫可以轻松读取。

提升爬取难度的思路

  1. 接口请求加密:对请求参数进行加密,防止爬虫直接使用明文参数。
  2. 动态签名校验:引入动态校验,确保每次请求都需要服务端计算验证。
  3. 混淆算法逻辑:将加密算法放在客户端,并通过代码混淆增加破解成本。
  4. 防止重放:使用时间戳或随机数防止重复请求。

基于动态签名的加密方案

思路

  • 生成动态签名(signature),将其作为参数附加到请求中。
  • 服务端验证签名是否合法,拒绝不合法的请求。

算法设计

  1. 请求参数排序。
  2. 拼接密钥(secret_key)。
  3. 对拼接后的字符串进行哈希加密(如 MD5/SHA256)。

PHP 实现:客户端加密

我们以一个简单的加密逻辑为例:

php
代码解读
复制代码
function generateSignature(array $params, string $secretKey): string { // 1. 对参数进行排序 ksort($params); // 2. 拼接参数和值 $queryString = http_build_query($params); // 3. 拼接密钥 $stringToSign = $queryString . '&key=' . $secretKey; // 4. 生成签名 (使用 MD5,也可以换成 SHA256) return md5($stringToSign); } // 模拟请求 $params = [ 'user_id' => 123, 'timestamp' => time(), 'action' => 'get_user_data', ]; $secretKey = 'mySecretKey123'; // 密钥 $signature = generateSignature($params, $secretKey); $params['signature'] = $signature; echo "加密后的请求参数:" . http_build_query($params);

输出示例:

sql
代码解读
复制代码
## 加密后的请求参数 user_id=123&timestamp=1707153456&action=get_user_data&signature=abcd1234efgh5678

PHP 实现:服务端校验

在服务端对请求参数和签名进行验证:

php
代码解读
复制代码
function verifySignature(array $params, string $secretKey): bool { // 提取签名 $signature = $params['signature'] ?? ''; unset($params['signature']); // 移除签名参数 // 重新生成签名 $expectedSignature = generateSignature($params, $secretKey); // 比较签名 return hash_equals($expectedSignature, $signature); } // 接收请求 $requestParams = [ 'user_id' => 123, 'timestamp' => 1707153456, 'action' => 'get_user_data', 'signature' => 'abcd1234efgh5678', ]; $secretKey = 'mySecretKey123'; if (verifySignature($requestParams, $secretKey)) { echo "签名校验通过,允许请求。\n"; } else { echo "签名校验失败,拒绝请求。\n"; } ?>

增加动态因素

为了进一步增强加密算法,可以加入时间戳或随机数:

更新签名生成函数

php
代码解读
复制代码
function generateSignature(array $params, string $secretKey): string { ksort($params); // 动态加入时间戳校验 $timestamp = $params['timestamp'] ?? 0; if (abs(time() - $timestamp) > 300) { // 5 分钟内有效 throw new Exception("时间戳无效"); } $queryString = http_build_query($params); $stringToSign = $queryString . '&key=' . $secretKey; return hash_hmac('sha256', $stringToSign, $secretKey); // 使用 HMAC 加密 }

完整请求流程

  1. 客户端加密请求

    • 用户请求时,客户端加密参数,生成签名。
    • 将签名作为参数发送给服务端。
  2. 服务端校验请求

    • 验证时间戳和随机数,防止重放攻击。
    • 校验签名是否与参数匹配。

效果提升

  • 爬虫难以直接复用接口:没有密钥无法伪造签名。
  • 请求伪造难度增加:动态时间戳和签名机制提升破解成本。
  • 安全性增强:即使数据被抓取,参数加密后依然难以解析。

需要注意的点

  1. 密钥管理:确保密钥安全,防止泄露。
  2. 算法复杂度:避免过于简单的加密逻辑。
  3. 性能优化:选择合适的加密算法,避免性能开销过大。
  4. 结合其他防护措施:如 IP 限制、行为验证(CAPTCHA)。

总结

通过在接口中加入加密和签名校验机制,我们可以有效提高爬虫爬取的难度。虽然不能完全杜绝爬虫,但大幅提升其破解成本,为接口安全提供多一层保护。希望这篇文章能给你一些启发,让你的 API 变得更加坚固!

注:本文转载自juejin.cn的Student_Li的文章"https://juejin.cn/post/7444749651402571786"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

103
后端
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top