」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > Laravel 的 TrimStrings 中介軟體如何導致問題

Laravel 的 TrimStrings 中介軟體如何導致問題

發佈於2024-11-08
瀏覽:393

How Laravel

Laravel 是 PHP 世界中的一個流行框架,為開發人員提供了簡化工作的強大工具。然而,有時這些便利可能會導致意想不到的問題。在這篇文章中,我將討論 Laravel 中的 TrimStrings 中介軟體如何導致問題以及如何解決這些問題。

什麼是 TrimStrings 中間件及其作用?

TrimStrings 中介軟體在 Laravel 應用程式中用於自動修剪傳入請求資料(例如表單輸入)中的空格。當使用者不小心在輸入欄位的開頭或結尾留下空格時,這特別有用。例如,如果使用者在表單中輸入“ [email protected] ”,並且電子郵件地址周圍有空格,則TrimStrings 中間件將修剪這些空格,確保僅處理“[email protected]” .

此功能有利於防止不必要的空格引起的錯誤以及處理更乾淨的資料。然而,一如既往,在某些特殊情況下,這種預設行為可能會導致意想不到的後果。

發生了什麼事?

在我們與巴西支付提供者整合的一個專案中,我們需要透過回調系統來擷取和驗證支付結果。支付提供者透過 POST 請求將交易結果傳送到我們的伺服器,我們透過執行

簽章/雜湊驗證來驗證請求。

此驗證過程遵循簡單的邏輯:

    我們取得提供者所發送的資料。
  1. 所有資料連接成一個字串。
  2. 此字串使用
  3. SHA256 演算法以及支付提供者提供的 金鑰 進行雜湊處理。
  4. 將產生的雜湊值與提供者發送的雜湊值進行比較。如果匹配,則請求被接受;否則,將被拒絕。
我們如何發現問題?

最初,很難理解為什麼一些有效的請求被拒絕。然而,在檢查 Nginx 日誌後,我們注意到傳入請求中的

full_name 參數保留了尾隨空格。儘管如此,在我們的伺服器上,這些空格已被修剪,導致哈希驗證失敗。這時我們意識到 TrimStrings 中間件導致了這個問題。

解決方案是什麼?

為了避免此類問題,需要針對特定路由或請求停用

TrimStrings中間件。 Laravel 8 引入了 TrimStrings::skipWhen 方法,它為這種情況提供了量身定制的解決方案。

以下是如何使用提供者應用此解決方案的範例:


使用 Illuminate\Foundation\Http\Middleware\TrimStrings; 使用 Illuminate\Http\Request; // ... TrimStrings::skipWhen(函數 (請求 $request) { 返回 $request->is('api/v1/integrations/foo-provider/callback'); });
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 這樣靈活的解決方案可以讓我們避免此類問題。

版本聲明 本文轉載於:https://dev.to/yidemir/how-trimstrings-can-become-a-problem-for-you-in-laravel-o4k?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>
  • useRef 的隱藏力量:為什麼它在 React 專案中至關重要
    useRef 的隱藏力量:為什麼它在 React 專案中至關重要
    介绍 您是否曾因 React 应用程序性能缓慢而苦苦挣扎,或者发现自己在与复杂的 DOM 操作作斗争?这些都是常见的头痛问题,但您不必忍受它们。想象一个您可以轻松优化性能并操作 DOM 元素而不会导致重新渲染的世界。来认识一下 useRef,这是一个简单但功能强大的 React h...
    程式設計 發佈於2024-11-09
  • 使用 GitLab CI/CD 和 Terraform 實作 Lambda 以進行 SFTP 整合、Go 中的 S Databricks
    使用 GitLab CI/CD 和 Terraform 實作 Lambda 以進行 SFTP 整合、Go 中的 S Databricks
    通过 Databricks 中的流程自动化降低成本 我的客户需要降低在 Databricks 上运行的流程的成本。 Databricks 负责的功能之一是从各种 SFTP 收集文件,解压缩它们并将它们放入数据湖中。 自动化数据工作流程是现代数据工程的重要组成部分。在本文中,我们将探...
    程式設計 發佈於2024-11-09
  • 改變您的文字分析之旅:KeyBERT 如何改變關鍵字提取的遊戲規則!
    改變您的文字分析之旅:KeyBERT 如何改變關鍵字提取的遊戲規則!
    在當今世界,我們受到資訊的轟炸,能夠從廣泛的內容中提取有意義的見解比以往任何時候都更加重要。無論您是資料科學家、研究人員還是開發人員,擁有正確的工具都可以幫助您將複雜的文件分解為關鍵元素。這就是 KeyBERT 的用武之地——一個強大的 Python 庫,旨在使用 BERT 嵌入技術來提取關鍵字和關...
    程式設計 發佈於2024-11-09
  • 建立資訊機器人:初學者指南(HTML/CSS、JavaScript、Gemini API)
    建立資訊機器人:初學者指南(HTML/CSS、JavaScript、Gemini API)
    Table of Contents Introduction What is a Chatbot? Understanding the Problem Setting Up the Development Environment Understanding the Problem ...
    程式設計 發佈於2024-11-09
  • Python 中的實例方法與類別方法:什麼時候應該使用“self”和“cls”?
    Python 中的實例方法與類別方法:什麼時候應該使用“self”和“cls”?
    深入研究類別和實例方法的細微差別:Beyond Self 與ClsPython 增強提案(PEP) 8 建議使用“self”作為實例方法中的第一個參數,「cls」作為類別方法中的第一個參數。這種差異源自於這些方法在處理實例和類別時所扮演的不同角色。 實例方法:自我優勢實例方法在實例的實例上呼叫班級。...
    程式設計 發佈於2024-11-09
  • 在 Python 中使用 bytes(n) 時,與數位轉換的主要差異是什麼?
    在 Python 中使用 bytes(n) 時,與數位轉換的主要差異是什麼?
    Python 中的位元組物件:超越數位轉換在Python 中使用位元組物件時,必須了解bytes(n) 是如何轉換的函數與數值轉換不同。將整數 n 傳遞給 bytes(n) 不會傳回 n 的二進位表示形式,而是建立一個長度為 n 且填入有空位元組 (\x00) 的位元組字串。 行為背後的基本原則此行...
    程式設計 發佈於2024-11-09
  • 如何使用 Docker 部署 Go 應用程式
    如何使用 Docker 部署 Go 應用程式
    Docker is a containerization platform that simplifies applications’ packaging, distribution, and deployment. You can harness the benefits of Go and Do...
    程式設計 發佈於2024-11-09
  • 如何在 MySQL 中將紀元時間戳轉換為人類可讀的日期?
    如何在 MySQL 中將紀元時間戳轉換為人類可讀的日期?
    在 MySQL 中將紀元時間戳轉換為人類可讀的日期在 MySQL 中,紀元時間戳是日期和時間的數字表示形式。它是自 Unix 紀元(即 1970 年 1 月 1 日 00:00:00 UTC)以來的毫秒數。 要將紀元時間戳轉換為人類可讀的日期,您可以使用 from_unixtime( ) 功能。函數...
    程式設計 發佈於2024-11-09
  • 如何使用 Pip 取得可用軟體包版本清單:綜合指南
    如何使用 Pip 取得可用軟體包版本清單:綜合指南
    如何使用Pip 取得可用套件版本清單:綜合指南Pip 是一個廣泛使用的Python 套件安裝程序,提供了一個安裝和管理Python 套件的有效方法。雖然它允許方便地安裝特定的軟體包版本,但在選擇最佳版本之前可能有必要探索所有可能版本的綜合清單。本文深入探討如何在各種 pip 版本中實現此目的。 Pi...
    程式設計 發佈於2024-11-09
  • ## **`std::vector::erase`傳回的迭代器在刪除後是否指向有效元素? **
    ## **`std::vector::erase`傳回的迭代器在刪除後是否指向有效元素? **
    std::vector 迭代器失效:詳細解釋std::vector 中迭代器失效的概念經常被討論。需要澄清的是,透過 std::vector::erase 擦除向量元素會使嚴格位於已擦除元素之後的迭代器無效。 但是,位於已擦除元素的確切位置的迭代器的有效性仍然不確定。從邏輯上講,人們可能會假設該迭代...
    程式設計 發佈於2024-11-09
  • Python 開發人員如何增強調試技術以獲得更有效率的程式碼?
    Python 開發人員如何增強調試技術以獲得更有效率的程式碼?
    Python 中增強的調試技術增強 Python 中的調試過程對於尋求優化程式碼的開發人員至關重要。以下是一些幫助您完成此任務的寶貴提示:利用 PDB 模組PDB(Python 調試器)模組提供了全面的調試環境。透過將 pdb.set_trace() 整合到程式碼中,您可以在特定位置建立斷點。這個靈...
    程式設計 發佈於2024-11-09
  • AdaBoost - 整合方法,分類:監督機器學習
    AdaBoost - 整合方法,分類:監督機器學習
    Boosting Definition and Purpose Boosting is an ensemble learning technique used in machine learning to improve the accuracy of models...
    程式設計 發佈於2024-11-09
  • 重新學習CS基礎知識-實作佇列
    重新學習CS基礎知識-實作佇列
    你曾經站在隊列中嗎,隊列資料結構也做同樣的事情。當你想在你最喜歡的自助餐廳點餐時,你站在隊伍的最後,然後你就可以繼續排隊並離開。 CS 中的佇列資料結構執行相同的功能。佇列資料結構是先進先出的資料結構。佇列資料結構可以使用兩個基本函數 Enqueue 和 Dequeue 來構建,這兩個函數基本上是...
    程式設計 發佈於2024-11-09
  • 為 Angular 18 設定 linter 和 IDE
    為 Angular 18 設定 linter 和 IDE
    將 eslint、prettier、env 加入應用程式。 遺憾的是,Angular 預設不會自行產生這一切。更改原理圖可以提高數千個 Angular 專案的品質。 設定 eslint 9 連結 eslint: yarn ng add @angular-eslint/schema...
    程式設計 發佈於2024-11-09
  • 使用 JavaScript 進行網頁抓取和代理設定的初學者指南
    使用 JavaScript 進行網頁抓取和代理設定的初學者指南
    使用JavaScript程式碼模擬使用者操作,以取得所需資訊。包括模擬使用者開啟網頁、點擊連結、輸入關鍵字等操作,並從網頁中提取所需資訊。 Javascript網頁抓取的核心原理 使用JavaScript程式碼模擬使用者操作來取得所需資訊。包括模擬使用者開啟網頁、點擊連結、輸入關鍵...
    程式設計 發佈於2024-11-09

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3