
本文旨在提供一种在 PHP/Laravel 环境下验证 Webhook 签名的方法。通过使用 openssl 扩展,我们可以对接收到的 Webhook 请求进行签名验证,确保请求的真实性和完整性。本文将详细介绍验证签名的步骤,并提供可直接使用的代码示例,帮助开发者有效地保护应用程序免受恶意请求的侵害。
在 Webhook 集成中,验证接收到的请求的签名至关重要,以确保请求来自可信的来源,并且在传输过程中没有被篡改。通常,发送方会对请求的内容进行签名,并将签名放在请求头中。接收方则需要使用相同的算法和密钥来验证签名。
以下是如何在 PHP/Laravel 中使用 openssl 扩展验证 SHA256withRSA 签名的步骤:
1. 获取签名、公钥和请求内容
立即学习“PHP免费学习笔记(深入)”;
首先,从请求头中获取签名,并获取用于验证签名的公钥。同时,获取原始的请求内容(payload),即请求体的内容。
use Illuminate\Http\Request;
public function isValid(Request $request): bool
{
$signature = $request->header('X-Signature');
if (! $signature) {
return false;
}
$publicKey = config('services.webhook.public_key'); // 从配置中获取公钥,建议不要硬编码
if (!$publicKey) {
return false;
}
$payload = $request->getContent();
// 后续步骤...
}2. 解码签名
签名通常是经过 Base64 编码的,因此需要先进行解码。
$signature = base64_decode($signature);
3. 使用 openssl_verify 函数进行验证
openssl_verify 函数用于验证签名。它接受原始数据、签名、公钥和使用的哈希算法作为参数。
$publicKey = openssl_pkey_get_public($publicKey);
$result = openssl_verify($payload, $signature, $publicKey, OPENSSL_ALGO_SHA256);
if ($result === 1) {
return true;
}
return false;
}完整示例代码:
use Illuminate\Http\Request;
class WebhookController extends Controller
{
public function handle(Request $request)
{
if ($this->isValid($request)) {
// 签名验证通过,处理 Webhook 事件
// ...
return response('Webhook received and processed successfully.', 200);
} else {
// 签名验证失败,拒绝处理
return response('Invalid signature.', 400);
}
}
private function isValid(Request $request): bool
{
$signature = $request->header('X-Signature');
if (! $signature) {
return false;
}
$publicKey = config('services.webhook.public_key'); // 从配置中获取公钥,建议不要硬编码
if (!$publicKey) {
return false;
}
$payload = $request->getContent();
$signature = base64_decode($signature);
$publicKey = openssl_pkey_get_public($publicKey);
$result = openssl_verify($payload, $signature, $publicKey, OPENSSL_ALGO_SHA256);
if ($result === 1) {
return true;
}
return false;
}
}注意事项:
总结:
通过使用 openssl 扩展,可以轻松地在 PHP/Laravel 中验证 Webhook 签名。这有助于确保接收到的请求来自可信的来源,并防止恶意请求的攻击。 请务必遵循上述注意事项,以确保签名验证的正确性和安全性。
以上就是使用 PHP/Laravel 验证 Webhook 签名的详细内容,更多请关注php中文网其它相关文章!
PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号