有时,我们辛苦编写的 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目录服务
以下是整个代码片段主要功能实现
主要功能模块
- 密钥生成与管理
- 生成256位随机密钥
- 自动轮换密钥,每24小时更新一次
- 保留最近3个密钥以支持优雅降级
- 密钥存储在安全存储系统中
- 内容加密解密
- 使用AES-256-CBC算法进行加密
- 支持对CSS和JavaScript文件进行加密
- 加密过程包含IV向量,以确保加密安全性
- 防止重放攻击
- 搜索引擎爬虫处理
- 支持主要的国内外搜索引擎
- 为爬虫提供未加密的资源,确保SEO优化
- 添加结构化数据以提高搜索引擎的可见性
- 安全防护措施
- 检测并阻止开发者工具的使用
- 禁用常见的调试快捷键
- 混淆页面内容和资源的URL
- 自动检测工具和爬虫的访问
- 动态加载与保护资源
部分代码要点讲解:
模块一:密钥生成与管理
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文件中即可。