160 lines
5.1 KiB
JavaScript
160 lines
5.1 KiB
JavaScript
/**
|
|
* IP 檢測功能測試腳本
|
|
* 用於測試和驗證IP白名單功能
|
|
*/
|
|
|
|
const { getClientIp, isIpAllowed, isValidIp, isValidCidr } = require('../lib/ip-utils.ts');
|
|
|
|
// 模擬請求對象
|
|
function createMockRequest(headers = {}) {
|
|
return {
|
|
headers,
|
|
connection: { remoteAddress: '192.168.1.100' },
|
|
socket: { remoteAddress: '192.168.1.100' },
|
|
ip: '192.168.1.100'
|
|
};
|
|
}
|
|
|
|
// 測試IP檢測功能
|
|
function testIpDetection() {
|
|
console.log('🧪 開始測試IP檢測功能...\n');
|
|
|
|
// 測試1: 基本IP檢測
|
|
console.log('📋 測試1: 基本IP檢測');
|
|
const basicRequest = createMockRequest({
|
|
'x-forwarded-for': '203.0.113.1, 192.168.1.100'
|
|
});
|
|
const detectedIp = getClientIp(basicRequest);
|
|
console.log(`檢測到的IP: ${detectedIp}`);
|
|
console.log(`預期結果: 203.0.113.1 (公網IP)`);
|
|
console.log(`實際結果: ${detectedIp === '203.0.113.1' ? '✅ 通過' : '❌ 失敗'}\n`);
|
|
|
|
// 測試2: Cloudflare代理
|
|
console.log('📋 測試2: Cloudflare代理');
|
|
const cloudflareRequest = createMockRequest({
|
|
'cf-connecting-ip': '203.0.113.2'
|
|
});
|
|
const cfIp = getClientIp(cloudflareRequest);
|
|
console.log(`檢測到的IP: ${cfIp}`);
|
|
console.log(`預期結果: 203.0.113.2`);
|
|
console.log(`實際結果: ${cfIp === '203.0.113.2' ? '✅ 通過' : '❌ 失敗'}\n`);
|
|
|
|
// 測試3: 本地開發環境
|
|
console.log('📋 測試3: 本地開發環境');
|
|
const localRequest = createMockRequest({
|
|
'x-forwarded-for': '127.0.0.1'
|
|
});
|
|
const localIp = getClientIp(localRequest);
|
|
console.log(`檢測到的IP: ${localIp}`);
|
|
console.log(`預期結果: 127.0.0.1 (本地回環)`);
|
|
console.log(`實際結果: ${localIp === '127.0.0.1' ? '✅ 通過' : '❌ 失敗'}\n`);
|
|
|
|
// 測試4: 多個代理IP
|
|
console.log('📋 測試4: 多個代理IP');
|
|
const multiProxyRequest = createMockRequest({
|
|
'x-forwarded-for': '203.0.113.3, 10.0.0.1, 192.168.1.1'
|
|
});
|
|
const multiIp = getClientIp(multiProxyRequest);
|
|
console.log(`檢測到的IP: ${multiIp}`);
|
|
console.log(`預期結果: 203.0.113.3 (第一個公網IP)`);
|
|
console.log(`實際結果: ${multiIp === '203.0.113.3' ? '✅ 通過' : '❌ 失敗'}\n`);
|
|
}
|
|
|
|
// 測試IP白名單功能
|
|
function testIpWhitelist() {
|
|
console.log('🔒 開始測試IP白名單功能...\n');
|
|
|
|
const allowedIps = '114.33.18.13,125.229.65.83,192.168.1.0/24';
|
|
|
|
// 測試1: 單一IP匹配
|
|
console.log('📋 測試1: 單一IP匹配');
|
|
const testIp1 = '114.33.18.13';
|
|
const result1 = isIpAllowed(testIp1, allowedIps);
|
|
console.log(`測試IP: ${testIp1}`);
|
|
console.log(`預期結果: true (在白名單中)`);
|
|
console.log(`實際結果: ${result1 ? '✅ 通過' : '❌ 失敗'}\n`);
|
|
|
|
// 測試2: CIDR範圍匹配
|
|
console.log('📋 測試2: CIDR範圍匹配');
|
|
const testIp2 = '192.168.1.100';
|
|
const result2 = isIpAllowed(testIp2, allowedIps);
|
|
console.log(`測試IP: ${testIp2}`);
|
|
console.log(`預期結果: true (在192.168.1.0/24範圍內)`);
|
|
console.log(`實際結果: ${result2 ? '✅ 通過' : '❌ 失敗'}\n`);
|
|
|
|
// 測試3: 不在白名單中的IP
|
|
console.log('📋 測試3: 不在白名單中的IP');
|
|
const testIp3 = '203.0.113.1';
|
|
const result3 = isIpAllowed(testIp3, allowedIps);
|
|
console.log(`測試IP: ${testIp3}`);
|
|
console.log(`預期結果: false (不在白名單中)`);
|
|
console.log(`實際結果: ${!result3 ? '✅ 通過' : '❌ 失敗'}\n`);
|
|
|
|
// 測試4: 空白名單
|
|
console.log('📋 測試4: 空白名單');
|
|
const testIp4 = '203.0.113.1';
|
|
const result4 = isIpAllowed(testIp4, '');
|
|
console.log(`測試IP: ${testIp4}`);
|
|
console.log(`預期結果: true (空白名單允許所有IP)`);
|
|
console.log(`實際結果: ${result4 ? '✅ 通過' : '❌ 失敗'}\n`);
|
|
}
|
|
|
|
// 測試IP格式驗證
|
|
function testIpValidation() {
|
|
console.log('🔍 開始測試IP格式驗證...\n');
|
|
|
|
// 測試有效IP
|
|
console.log('📋 測試有效IP格式');
|
|
const validIps = ['192.168.1.1', '10.0.0.1', '203.0.113.1'];
|
|
validIps.forEach(ip => {
|
|
const isValid = isValidIp(ip);
|
|
console.log(`${ip}: ${isValid ? '✅ 有效' : '❌ 無效'}`);
|
|
});
|
|
console.log('');
|
|
|
|
// 測試無效IP
|
|
console.log('📋 測試無效IP格式');
|
|
const invalidIps = ['192.168.1.256', '10.0.0', 'invalid', '192.168.1.1.1'];
|
|
invalidIps.forEach(ip => {
|
|
const isValid = isValidIp(ip);
|
|
console.log(`${ip}: ${!isValid ? '✅ 正確拒絕' : '❌ 錯誤接受'}`);
|
|
});
|
|
console.log('');
|
|
|
|
// 測試CIDR格式
|
|
console.log('📋 測試CIDR格式');
|
|
const validCidrs = ['192.168.1.0/24', '10.0.0.0/8', '172.16.0.0/12'];
|
|
validCidrs.forEach(cidr => {
|
|
const isValid = isValidCidr(cidr);
|
|
console.log(`${cidr}: ${isValid ? '✅ 有效' : '❌ 無效'}`);
|
|
});
|
|
console.log('');
|
|
}
|
|
|
|
// 主測試函數
|
|
function runAllTests() {
|
|
console.log('🚀 IP白名單功能測試套件\n');
|
|
console.log('=' * 50);
|
|
|
|
try {
|
|
testIpDetection();
|
|
testIpWhitelist();
|
|
testIpValidation();
|
|
|
|
console.log('🎉 所有測試完成!');
|
|
} catch (error) {
|
|
console.error('❌ 測試過程中發生錯誤:', error);
|
|
}
|
|
}
|
|
|
|
// 如果直接運行此腳本
|
|
if (require.main === module) {
|
|
runAllTests();
|
|
}
|
|
|
|
module.exports = {
|
|
testIpDetection,
|
|
testIpWhitelist,
|
|
testIpValidation,
|
|
runAllTests
|
|
};
|