保护您的 CSS 和 JS 代码 | 资源保护函数代码-记录

有时,我们辛苦编写的 CSS 代码可能会被他人轻易获取。为了解决这个问题,可以使用这段资源保护代码。该代码在保护内容的同时,确保不会影响主流搜索引擎的 SEO 爬虫。当检测到特定搜索引擎时,CSS 和 JavaScript 等相关内容将以未加密未混淆的正常状态提供,甚至还进一步做了文章数据的结构化优化。可自行添加更多搜索引擎。

怎么说呢?也就是心理作用,顶多给小白找麻烦,实际作用就是拖慢获取速度。换个不常用的浏览器还是能轻松的获得没有加密的代码。

            // 国外主流搜索引擎

            'Googlebot', // Google搜索

            'bingbot',   // 微软Bing搜索

            'Slurp',     // Yahoo搜索

            'DuckDuckBot', // DuckDuckGo搜索

            'YandexBot',   // Yandex搜索

            'AhrefsBot',   // Ahrefs SEO工具

            'Applebot',    // Apple搜索

            'facebookexternalhit', // Facebook爬虫

            'Twitterbot',   // Twitter爬虫

            'LinkedInBot',  // LinkedIn爬虫

            'Pinterestbot', // Pinterest爬虫

            'SemrushBot',   // SEMrush SEO工具

            'Yeti',         // Naver搜索

            'Exabot',       // Exalead搜索

            'ia_archiver',  // Internet Archive爬虫

            'archive.org_bot', // Internet Archive备用爬虫

            'Nutch',        // Apache Nutch爬虫

            'Alexabot',     // Alexa排名服务

            'MJ12bot',      // Majestic SEO工具

            'BLEXBot',      // BLEXBot爬虫

            'dotbot',       // Moz爬虫

            'rogerbot',     // Moz备用爬虫

            // 中国主流搜索引擎

            'Baiduspider',      // 百度主爬虫

            'Baiduspider-image', // 百度图片爬虫

            'Baiduspider-video', // 百度视频爬虫

            'Baiduspider-news',  // 百度新闻爬虫

            'Sogou',             // 搜狗主爬虫

            'Sogou web spider',  // 搜狗网页爬虫

            'Sogou inst spider', // 搜狗即时爬虫

            'Sogou spider',      // 搜狗通用爬虫

            'Bytespider',        // 字节跳动爬虫

            '360Spider',         // 360搜索主爬虫

            '360Spider-Image',   // 360图片爬虫

            '360Spider-Video',   // 360视频爬虫

            'HaosouSpider',      // 好搜爬虫

            'YisouSpider',       // 神马搜索爬虫

            'JikeSpider',        // 即刻搜索爬虫

            'ChinasoSpider',     // 中国搜索爬虫

            // 其他区域搜索引擎

            'Baiduspider-render', // 百度渲染爬虫

            'NaverBot',           // 韩国Naver主爬虫

            'Yeti',               // 韩国Naver备用爬虫

            'Daum',               // 韩国Daum爬虫

            'Genieo',             // 以色列Genieo爬虫

            'ichiro',             // 日本goo爬虫

            'YandexMobileBot',    // Yandex移动版爬虫

            'YandexImages',       // Yandex图片爬虫

            'YandexVideo',        // Yandex视频爬虫

            'YandexMedia',        // Yandex媒体爬虫

            'YandexBlogs',        // Yandex博客爬虫

            'YandexFavicons',     // Yandex图标爬虫

            'YandexWebmaster',    // Yandex站长工具

            'YandexPagechecker',  // Yandex页面检查器

            'YandexImageResizer', // Yandex图片处理

            'YandexDirect',       // Yandex直达服务

            'YandexMetrika',      // Yandex统计服务

            'YandexNews',         // Yandex新闻服务

            'YandexCatalog',      // Yandex目录服务

以下是整个代码片段主要功能实现

主要功能模块

  1. 密钥生成与管理
    • 生成256位随机密钥
    • 自动轮换密钥,每24小时更新一次
    • 保留最近3个密钥以支持优雅降级
    • 密钥存储在安全存储系统中
  2. 内容加密解密
    • 使用AES-256-CBC算法进行加密
    • 支持对CSS和JavaScript文件进行加密
    • 加密过程包含IV向量,以确保加密安全性
    • 防止重放攻击
  3. 搜索引擎爬虫处理
    • 支持主要的国内外搜索引擎
    • 为爬虫提供未加密的资源,确保SEO优化
    • 添加结构化数据以提高搜索引擎的可见性
  4. 安全防护措施
    • 检测并阻止开发者工具的使用
    • 禁用常见的调试快捷键
    • 混淆页面内容和资源的URL
    • 自动检测工具和爬虫的访问
    • 动态加载与保护资源
图片[1]-保护您的 CSS 和 JS 代码 | 资源保护函数代码
图片[2]-保护您的 CSS 和 JS 代码 | 资源保护函数代码

部分代码要点讲解:

模块一:密钥生成与管理

1.1 密钥生成

import os
import binascii

def generate_css_key():
    """生成256位(32字节)随机密钥,返回为十六进制格式的字符串"""
    key = os.urandom(32)  # 生成32字节的随机密钥
    return binascii.hexlify(key).decode('utf-8')  # 转为十六进制字符串
  • os.urandom(32):这个方法从操作系统中获取32个随机字节,适用于加密密钥的生成,因为它提供了较高的随机性。
  • binascii.hexlify:将二进制数据转换为十六进制表示的字符串,便于存储和传输。

1.2 密钥存储与获取

import os

def get_secure_key():
    """从安全存储获取密钥"""
    return os.environ.get("CSS_ENCRYPTION_KEY")  # 从环境变量获取密钥

def store_secure_key(key):
    """将新生成的密钥存储到安全存储中"""
    os.environ["CSS_ENCRYPTION_KEY"] = key  # 存储到环境变量中
  • 环境变量:使用环境变量来存储密钥是一种常见的安全做法,避免将密钥硬编码在代码中。
  • 密钥轮换:可以通过定期更换密钥(例如每日更换)来增强安全性。

模块二:内容加密与解密

2.1 加密内容

from Crypto.Cipher import AES
import base64
import os
import time

def encrypt_css(content):
    """加密CSS内容,返回加密后的Base64编码字符串"""
    key = get_secure_key()  # 获取密钥
    cipher = AES.new(bytes.fromhex(key), AES.MODE_CBC)  # 创建AES加密器
    iv = os.urandom(16)  # 生成随机IV
    padded_content = pad(content)  # 填充内容
    encrypted = cipher.encrypt(padded_content)  # 加密内容
    # 组合IV和加密数据
    return base64.b64encode(iv + encrypted + str(int(time.time())).encode()).decode('utf-8')
  • AES加密:采用AES算法的CBC模式。CBC模式需要一个初始化向量(IV),确保同一明文在多次加密时产生不同的密文。
  • 填充内容:使用PKCS#7填充,使得明文的长度是块大小的整数倍。
  • 时间戳:加密后的内容包括一个时间戳,允许后续解密时验证内容是否过期。

2.2 解密内容

def decrypt_css(encrypted_content):
    """解密加密的CSS内容"""
    key = get_secure_key()  # 获取密钥
    raw = base64.b64decode(encrypted_content)  # 解码Base64
    iv = raw[:16]  # 提取IV
    encrypted = raw[16:-10]  # 提取加密内容
    timestamp = int(raw[-10:])  # 提取时间戳
    if time.time() - timestamp > 3600:  # 检查是否过期
        raise Exception("Content has expired")
    
    cipher = AES.new(bytes.fromhex(key), AES.MODE_CBC, iv)  # 创建AES解密器
    decrypted = cipher.decrypt(encrypted)  # 解密
    return unpad(decrypted).decode('utf-8')  # 去除填充并返回明文
  • 解码与提取:从Base64解码得到原始数据,分别提取IV、加密内容和时间戳。
  • 过期检查:通过比较当前时间和时间戳判断内容是否过期,增加安全性。
  • 解密:使用相同的密钥和IV进行解密,恢复原始明文。

模块三:搜索引擎爬虫处理

3.1 检测爬虫

import re

def is_search_engine_bot(user_agent):
    """检测请求是否来自搜索引擎爬虫"""
    bots = ["Googlebot", "Bingbot", "Slurp", "DuckDuckBot"]
    return any(bot in user_agent for bot in bots)
  • User-Agent检测:通过正则表达式匹配常见搜索引擎的User-Agent字符串,判断请求是否来自爬虫。

3.2 提供未加密资源

def protect_dynamic_css(user_agent):
    """动态加载CSS资源"""
    if is_search_engine_bot(user_agent):
        return load_css_unprotected()  # 加载未加密的CSS
    else:
        return load_css_protected()  # 加载加密的CSS
  • 条件加载:根据是否为搜索引擎爬虫决定加载加密或未加密的CSS等正常未混淆加密的内容,确保SEO效果。

模块四:安全防护措施

4.1 开发者工具检测

document.onkeydown = function(event) {
    if (event.key === "F12" || (event.ctrlKey && event.shiftKey && event.key === "I")) {
        alert("开发者工具被禁用。");
        return false;  // 阻止打开开发者工具
    }
};
  • JavaScript检测:通过监听键盘事件,阻止用户使用快捷键打开开发者工具,增加一定的资源保护。

4.2 混淆资源URL

def obfuscate_url(url):
    """混淆URL以增强安全性"""
    return "obfuscated_" + url  # 简单示例,实际可使用更复杂的逻辑
  • URL混淆:通过简单的字符串操作混淆资源URL,使得直接访问资源的难度增加,减少被盗用的风险。

4.3 动态加载与保护资源

def load_css():
    user_agent = get_user_agent()  # 获取用户代理
    return protect_dynamic_css(user_agent)  # 保护CSS加载
  • 动态加载:根据访问者的User-Agent决定加载不同的CSS资源,确保有效性与安全性。

以下是实现上述功能的完整PHP代码示例:

使用方法:

直接将上方代码放入functions.php中或func文件中即可。

© 版权声明
THE END
喜欢就支持一下吧
赞赏