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

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

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

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]刪除
最新教學 更多>
  • Python元類工作原理及類創建與定制
    Python元類工作原理及類創建與定制
    python中的metaclasses是什麼? Metaclasses負責在Python中創建類對象。就像類創建實例一樣,元類也創建類。他們提供了對類創建過程的控制層,允許自定義類行為和屬性。 在Python中理解類作為對象的概念,類是描述用於創建新實例或對象的藍圖的對象。這意味著類本身是使用...
    程式設計 發佈於2025-07-03
  • 查找當前執行JavaScript的腳本元素方法
    查找當前執行JavaScript的腳本元素方法
    如何引用當前執行腳本的腳本元素在某些方案中理解問題在某些方案中,開發人員可能需要將其他腳本動態加載其他腳本。但是,如果Head Element尚未完全渲染,則使用document.getElementsbytagname('head')[0] .appendChild(v)的常規方...
    程式設計 發佈於2025-07-03
  • MySQL中如何高效地根據兩個條件INSERT或UPDATE行?
    MySQL中如何高效地根據兩個條件INSERT或UPDATE行?
    在兩個條件下插入或更新或更新 solution:的答案在於mysql的插入中...在重複鍵更新語法上。如果不存在匹配行或更新現有行,則此功能強大的功能可以通過插入新行來進行有效的數據操作。如果違反了唯一的密鑰約束。 實現所需的行為,該表必須具有唯一的鍵定義(在這種情況下為'名稱'...
    程式設計 發佈於2025-07-03
  • 如何將PANDAS DataFrame列轉換為DateTime格式並按日期過濾?
    如何將PANDAS DataFrame列轉換為DateTime格式並按日期過濾?
    將pandas dataframe列轉換為dateTime格式示例:使用column(mycol)包含以下格式的以下dataframe,以自定義格式:})指定的格式參數匹配給定的字符串格式。轉換後,MyCol列現在將包含DateTime對象。 date oped filtering > = ...
    程式設計 發佈於2025-07-03
  • 如何解決AppEngine中“無法猜測文件類型,使用application/octet-stream...”錯誤?
    如何解決AppEngine中“無法猜測文件類型,使用application/octet-stream...”錯誤?
    appEngine靜態文件mime type override ,靜態文件處理程序有時可以覆蓋正確的mime類型,在錯誤消息中導致錯誤消息:“無法猜測mimeType for for file for file for [File]。 application/application/octet...
    程式設計 發佈於2025-07-03
  • 為什麼我的CSS背景圖像出現?
    為什麼我的CSS背景圖像出現?
    故障排除:CSS背景圖像未出現 ,您的背景圖像儘管遵循教程說明,但您的背景圖像仍未加載。圖像和样式表位於相同的目錄中,但背景仍然是空白的白色帆布。 而不是不棄用的,您已經使用了CSS樣式: bockent {背景:封閉圖像文件名:背景圖:url(nickcage.jpg); 如果您的html,cs...
    程式設計 發佈於2025-07-03
  • Java中如何使用觀察者模式實現自定義事件?
    Java中如何使用觀察者模式實現自定義事件?
    在Java 中創建自定義事件的自定義事件在許多編程場景中都是無關緊要的,使組件能夠基於特定的觸發器相互通信。本文旨在解決以下內容:問題語句我們如何在Java中實現自定義事件以促進基於特定事件的對象之間的交互,定義了管理訂閱者的類界面。 以下代碼片段演示瞭如何使用觀察者模式創建自定義事件: args...
    程式設計 發佈於2025-07-03
  • Async Void vs. Async Task在ASP.NET中:為什麼Async Void方法有時會拋出異常?
    Async Void vs. Async Task在ASP.NET中:為什麼Async Void方法有時會拋出異常?
    在ASP.NET async void void async void void void void void void void的設計無需返回asynchroncon而無需返回任務對象。他們在執行過程中增加未償還操作的計數,並在完成後減少。在某些情況下,這種行為可能是有益的,例如未期望或明確...
    程式設計 發佈於2025-07-03
  • 解決Spring Security 4.1及以上版本CORS問題指南
    解決Spring Security 4.1及以上版本CORS問題指南
    彈簧安全性cors filter:故障排除常見問題 在將Spring Security集成到現有項目中時,您可能會遇到與CORS相關的錯誤,如果像“訪問Control-allo-allow-Origin”之類的標頭,則無法設置在響應中。為了解決此問題,您可以實現自定義過濾器,例如代碼段中的MyFi...
    程式設計 發佈於2025-07-03
  • 將圖片浮動到底部右側並環繞文字的技巧
    將圖片浮動到底部右側並環繞文字的技巧
    在Web設計中圍繞在Web設計中,有時可以將圖像浮動到頁面右下角,從而使文本圍繞它纏繞。這可以在有效地展示圖像的同時創建一個吸引人的視覺效果。 css位置在右下角,使用css float and clear properties: img { 浮點:對; ...
    程式設計 發佈於2025-07-03
  • 如何處理PHP文件系統功能中的UTF-8文件名?
    如何處理PHP文件系統功能中的UTF-8文件名?
    在PHP的Filesystem functions中處理UTF-8 FileNames 在使用PHP的MKDIR函數中含有UTF-8字符的文件很多flusf-8字符時,您可能會在Windows Explorer中遇到comploreer grounder grounder grounder gro...
    程式設計 發佈於2025-07-03
  • Python高效去除文本中HTML標籤方法
    Python高效去除文本中HTML標籤方法
    在Python中剝離HTML標籤,以獲取原始的文本表示Achieving Text-Only Extraction with Python's MLStripperTo streamline the stripping process, the Python standard librar...
    程式設計 發佈於2025-07-03
  • 為什麼我會收到MySQL錯誤#1089:錯誤的前綴密鑰?
    為什麼我會收到MySQL錯誤#1089:錯誤的前綴密鑰?
    mySQL錯誤#1089:錯誤的前綴鍵錯誤descript [#1089-不正確的前綴鍵在嘗試在表中創建一個prefix鍵時會出現。前綴鍵旨在索引字符串列的特定前綴長度長度,可以更快地搜索這些前綴。 了解prefix keys `這將在整個Movie_ID列上創建標準主鍵。主密鑰對於唯一識...
    程式設計 發佈於2025-07-03
  • Java中假喚醒真的會發生嗎?
    Java中假喚醒真的會發生嗎?
    在Java中的浪費喚醒:真實性或神話? 在Java同步中偽裝喚醒的概念已經是討論的主題。儘管存在這種行為的潛力,但問題仍然存在:它們實際上是在實踐中發生的嗎? Linux的喚醒機制根據Wikipedia關於偽造喚醒的文章,linux實現了pthread_cond_wait()功能的Linux實現,...
    程式設計 發佈於2025-07-03

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

Copyright© 2022 湘ICP备2022001581号-3