当前位置:首页 > PHP

php实现url签名

2026-02-15 20:32:59PHP

实现URL签名的基本步骤

生成URL签名可以确保URL的完整性和安全性,防止篡改。以下是PHP实现URL签名的基本方法:

准备URL参数 将需要签名的URL参数按照字母顺序排序,确保签名的一致性。使用http_build_query函数将参数转换为字符串。

$params = [
    'param1' => 'value1',
    'param2' => 'value2',
    'timestamp' => time()
];
ksort($params);
$queryString = http_build_query($params);

生成签名 使用HMAC算法(如SHA256)和密钥对参数字符串进行签名。密钥应妥善保管,避免泄露。

$secretKey = 'your_secret_key';
$signature = hash_hmac('sha256', $queryString, $secretKey);

将签名附加到URL 将生成的签名作为参数附加到原始URL中,确保接收方可以验证签名。

$params['signature'] = $signature;
$signedUrl = 'http://example.com/api?' . http_build_query($params);

验证URL签名的方法

接收方需要验证URL签名的有效性,确保请求未被篡改。

提取签名 从URL参数中提取签名,并移除签名参数以便重新生成签名进行比对。

$receivedSignature = $_GET['signature'];
unset($_GET['signature']);

重新生成签名 使用相同的密钥和参数重新生成签名,与接收到的签名进行比对。

ksort($_GET);
$queryString = http_build_query($_GET);
$expectedSignature = hash_hmac('sha256', $queryString, $secretKey);

验证签名 比较接收到的签名和重新生成的签名是否一致,不一致则说明URL可能被篡改。

if (hash_equals($expectedSignature, $receivedSignature)) {
    echo '签名验证通过';
} else {
    echo '签名验证失败';
}

增强安全性的建议

添加时间戳 在URL参数中加入时间戳,可以防止重放攻击。验证时检查时间戳是否在有效范围内。

$timestamp = $_GET['timestamp'];
if (time() - $timestamp > 300) { // 5分钟有效期
    echo '请求已过期';
}

使用一次性随机数 为每次请求生成唯一的随机数(nonce),确保同一请求不会被重复使用。

$nonce = bin2hex(random_bytes(16));
$params['nonce'] = $nonce;

限制签名有效期 通过设置签名有效期,减少被截获后利用的风险。验证时检查时间戳是否在合理范围内。

if (abs(time() - $timestamp) > 300) {
    echo '请求已过期';
}

完整示例代码

以下是一个完整的URL签名生成和验证的示例代码:

生成签名URL

$params = [
    'param1' => 'value1',
    'param2' => 'value2',
    'timestamp' => time(),
    'nonce' => bin2hex(random_bytes(16))
];
ksort($params);
$queryString = http_build_query($params);
$secretKey = 'your_secret_key';
$signature = hash_hmac('sha256', $queryString, $secretKey);
$params['signature'] = $signature;
$signedUrl = 'http://example.com/api?' . http_build_query($params);

验证签名URL

$receivedSignature = $_GET['signature'];
unset($_GET['signature']);
ksort($_GET);
$queryString = http_build_query($_GET);
$expectedSignature = hash_hmac('sha256', $queryString, $secretKey);

if (!hash_equals($expectedSignature, $receivedSignature)) {
    die('签名验证失败');
}

if (abs(time() - $_GET['timestamp']) > 300) {
    die('请求已过期');
}

echo '签名验证通过';

php实现url签名

标签: phpurl
分享给朋友:

相关文章

git php实现

git php实现

Git 与 PHP 的集成实现 使用 PHP 执行 Git 命令 通过 PHP 的 exec()、shell_exec() 或 passthru() 函数可以直接调用 Git 命令,适用于服务器端操作…

php实现表单

php实现表单

PHP 表单基础实现 创建一个简单的 PHP 表单需要 HTML 表单结构和 PHP 处理脚本。以下是一个完整的示例: HTML 表单部分 (form.html) <form action=…

php实现

php实现

PHP 实现的基本方法 PHP 是一种服务器端脚本语言,广泛用于 Web 开发。以下是 PHP 实现的一些常见方法。 变量与数据类型 PHP 变量以 $ 开头,支持多种数据类型: $nam…

php 实现登录

php 实现登录

PHP 登录功能实现 使用 PHP 实现登录功能通常需要结合数据库验证和会话管理。以下是一个基本的登录实现流程: 数据库准备 创建用户表存储用户名和密码(建议使用哈希加密): CREATE TAB…

php 队列的实现

php 队列的实现

PHP 队列的实现方法 使用数据库实现队列 创建一个数据表存储队列任务,包含任务ID、状态、创建时间等字段。通过SQL语句实现任务的入队和出队操作。 // 入队操作 INSERT INTO queu…

php实现登陆

php实现登陆

PHP 实现登录功能 创建登录表单 在 HTML 文件中创建一个登录表单,包含用户名和密码输入框,表单的 action 属性指向处理登录的 PHP 文件。 <form action="logi…