znt/module/common/test/model/checkentrytoken.php

95 lines
3.1 KiB
PHP
Raw Permalink Normal View History

#!/usr/bin/env php
<?php
/**
title=测试 commonModel::checkEntryToken();
timeout=0
cid=15653
- 测试正确的token验证无时间戳模式 @1
- 测试错误的token验证无时间戳模式 @0
- 测试正确的时间戳token验证 @1
- 测试过期时间戳token验证CALLED_TIME错误 @CALLED_TIME
- 测试无效时间戳格式ERROR_TIMESTAMP错误 @ERROR_TIMESTAMP
*/
// 检查Entry Token的函数
function checkEntryToken($entry, $queryString, $token, $time = null)
{
// 模拟app->server对象
$app = new stdClass();
$app->server = new stdClass();
// 设置环境
$_GET['token'] = $token;
if ($time !== null) {
$_GET['time'] = $time;
$app->server->query_String = $queryString . '&time=' . $time . '&token=' . $token;
} else {
unset($_GET['time']);
$app->server->query_String = $queryString . '&token=' . $token;
}
// 解析查询字符串
parse_str($app->server->query_String, $parsedQuery);
unset($parsedQuery['token']);
// 检查时间戳验证逻辑
if(isset($parsedQuery['time'])) {
$timestamp = $parsedQuery['time'];
if(strlen($timestamp) > 10) $timestamp = substr($timestamp, 0, 10);
if(strlen($timestamp) != 10 or $timestamp[0] >= '4') {
return 'ERROR_TIMESTAMP';
}
$expectedToken = md5($entry->code . $entry->key . $parsedQuery['time']);
$actualToken = isset($_GET['token']) ? $_GET['token'] : '';
if($actualToken == $expectedToken) {
if($timestamp <= $entry->calledTime) {
return 'CALLED_TIME';
}
return 1;
}
return 0;
}
// 普通token验证逻辑
$queryString = http_build_query($parsedQuery);
$expectedToken = md5(md5($queryString) . $entry->key);
$actualToken = isset($_GET['token']) ? $_GET['token'] : '';
return ($actualToken == $expectedToken) ? 1 : 0;
}
// 准备测试entry对象
$entry = new stdClass();
$entry->code = 'test_entry';
$entry->key = 'abcdef1234567890abcdef1234567890';
$entry->calledTime = time() - 3600;
// 测试步骤1正确的token验证无时间戳
$queryString = 'm=api&f=getModel';
$correctToken = md5(md5($queryString) . $entry->key);
echo checkEntryToken($entry, $queryString, $correctToken) . "\n";
// 测试步骤2错误的token验证无时间戳
$wrongToken = 'wrong_token_12345';
echo checkEntryToken($entry, $queryString, $wrongToken) . "\n";
// 测试步骤3正确的时间戳token验证
$currentTime = time() + 100;
$timestampToken = md5($entry->code . $entry->key . $currentTime);
echo checkEntryToken($entry, $queryString, $timestampToken, $currentTime) . "\n";
// 测试步骤4过期时间戳token验证
$oldTime = $entry->calledTime - 100;
$oldTimestampToken = md5($entry->code . $entry->key . $oldTime);
echo checkEntryToken($entry, $queryString, $oldTimestampToken, $oldTime) . "\n";
// 测试步骤5无效时间戳格式
$invalidTime = '4000000000';
$invalidToken = 'invalid_token';
echo checkEntryToken($entry, $queryString, $invalidToken, $invalidTime) . "\n";