首页 小组 问答 话题 好文 素材 用户 唠叨 我的社区

[分享]Laravel 的 TrimStrings 中间件如何导致问题

天启Lv.1普通用户
2024-08-20 17:09:49
0
50

Laravel 是 PHP 世界中流行的框架,为开发人员提供了简化工作的绝佳工具。但是,有时这些便利可能会导致意想不到的问题。在这篇文章中,我将讨论 Laravel 中的 TrimStrings 中间件如何导致问题以及如何解决这些问题。


什么是 TrimStrings 中间件,它有什么作用?

TrimStrings 中间件用于 Laravel 应用程序中,用于自动修剪传入请求数据(例如表单输入)中的空格。当用户不小心在输入字段的开头或结尾留下空格时,这特别有用。例如,如果用户在表单中输入带有空格的“user@example.com”,则 TrimStrings 中间件将修剪这些空格,确保只处理“user@example.com”。

此功能有助于防止由不必要的空格引起的错误,并有助于处理更清晰的数据。但是,与往常一样,在某些特殊情况下,此默认行为可能会导致意想不到的后果。

发生了什么事?

在一个项目中,我们正在与一家位于巴西的支付提供商集成,我们需要通过回拨系统捕获和验证支付结果。支付提供商通过 POST 请求将交易结果发送到我们的服务器,我们通过执行签名/哈希验证来验证该请求。

此验证过程遵循一个简单的逻辑:

  1. 我们接受提供商发送的数据。

  2. 所有数据都连接成一个字符串。

  3. 此字符串使用 SHA256 算法进行哈希处理,并使用支付提供商提供的密钥

  4. 生成的哈希值将与提供商发送的哈希值进行比较。如果它们匹配,则接受请求;否则,它将被拒绝。

我们是如何发现问题的?

最初,很难理解为什么一些有效的请求被拒绝。但是,在检查了 Nginx 日志后,我们注意到传入请求中的 full_name 参数保留了尾随空格。尽管如此,在我们的服务器上,这些空间已被修剪,导致哈希验证失败。就在那时,我们意识到 TrimStrings 中间件导致了这个问题。

解决方案是什么?

为了避免此类问题,有必要禁用特定路由或请求的 TrimStrings 中间件。Laravel 8 引入了 TrimStrings::skipWhen 方法,该方法为这种情况提供了量身定制的解决方案。

下面是如何使用提供程序应用此解决方案的示例:

use Illuminate\Foundation\Http\Middleware\TrimStrings;
use Illuminate\Http\Request;

// ...

TrimStrings::skipWhen(function (Request $request) {
    return $request->is('api/v1/integrations/foo-provider/callback');
});

此代码片段禁用特定路由的 TrimStrings 中间件。在这种情况下,不会对来自路由的请求进行修剪,从而确保哈希验证过程顺利进行。api/v1/integrations/foo-provider/callback

结论

Laravel 的默认功能通常会让事情变得更容易,但在某些情况下,它们可能会导致意想不到的结果。因此,了解我们使用的工具是如何运作的,并仔细评估它们的潜在影响是非常重要的。虽然 TrimStrings 中间件在大多数情况下是一个有用的工具,但在此类情况下,它可能会导致问题。幸运的是,像 TrimStrings::skipWhen 这样的灵活解决方案使我们能够避免此类问题。

天启
天启

63 天前

签名 : 大运河向南是我家   50       0
评论
站长交流