【前端基礎】為什麼前端要檢核表單內容?低成本優化前端使用者體驗

更新 發佈閱讀 6 分鐘

在前端的開發中,除了切版與串 API 外,大部分的時間都在針對表單內容進行檢核、驗證、阻擋,一方面是讓使用者在操作頁面的過程中有良好的使用者體驗,不會因為一些例外狀況(Edge Case),例如:莫名其妙的 4xx 錯誤,導致使用者卡在某個操作流程中逃不出來,另一方面是讓傳遞到後端的資料更加正確,避免浪費不必要的網路請求與運算成本。

即便前端資料檢核可以說是非常重要的步驟,越嚴謹的驗證規則越會讓工程師額外多花一些時間進行開發與測試,因此常常會聽到怕麻煩的前端工程師說:「後端有做檢核,為什麼前端還要再做一次?」

以前剛接觸前端的時候我也會困惑這個問題,隨著自己經手過幾個大型的電子商務平台後,才慢慢意識到前端表單檢核、驗證的好處,由於表單驗證的好處多過於壞處,我們就來聊聊前端偷懶不做表單驗證可能會發生的危機吧:

缺乏表單驗證可能會出現的網頁危機

  • SQL 注入:資料庫乘載著網路服務中最寶貴的財產:「資料」,假設今天前端在打 API 不驗證傳遞過去的資料格式,而後端工程師也沒經過額外的處理就把這串資料直接丟到資料庫裡,萬一這串挾帶的資料中有任何程式碼片段,都有可能直接性的侵入資料庫進行程式碼的執行,嚴重還會出現資料庫整個被打包加密勒索、使用者資料外洩的狀況。雖然 SQL 注入的安全性檢核後端可能需要負更大的責任,但對前端而言,擋住一些不正確的輸入值,可以大大減輕後端在檢核這一塊的負擔。
  • XSS 攻擊:假設前端工程師沒有針對一些特殊符號做過濾,惡意攻擊軟體、駭客有機會往輸入框塞一些可被執行的腳本,造成光是在網頁使用服務,就有可能造成使用者資料的外洩。
  • 不必要的伺服器成本:前端如果一直丟錯誤的資料格式到後端,可能會出現過多無效請求,直接影響到伺服器的維運成本,在一些以運算量為計價單位的雲服務,前端工程師的小偷懶,可能就會造成一些不必要的伺服器支出。
  • 干擾使用者體驗:如果前端一直丟不符合後端 API 規範的參數打 API ,可以預期回傳錯誤情境的狀況會大大提高,在好一點的狀況中,前端可能會用一些彈窗、提示訊息捕捉例外錯誤情境,告訴使用者目前有些錯誤,需要調整表單內容,但不經驗證的內容,就會造成這些錯誤訊息一直在頁面上瘋狂跳出,干擾使用者體驗。最不好的狀況就是:既不做表單驗證,也不使用一些頁面彈窗、提示訊息讓使用者知道當前的頁面狀況,網站很容易因此流失使用者。
  • 程式碼易出錯:姑且不論使用者的使用感受,不經驗證的欄位內容不僅難以從使用者介面上看出來,在程式碼的除錯也需要花額外的時間,也比較難在第一時間知道問題點:是資料沒有成功更新?事件沒有綁好? API 有成功打出去嗎?是 API 的參數不符合規範嗎?程式碼出錯的原因百百種,不寫表單驗證就是其中一種。

前端的驗證手段

經過上述的說明,大概可以理解前端的表單驗證除了在開發上會比較花時間外,基本上能稱得上百利無一害,接著就來聊聊前端一些針對格式的檢核方式:

  • 判斷是否為空值:在一個固定需要有值的欄位上,我們可以簡單寫一個 Util 函式來進行驗證,每當需要進行空值的檢核時就呼叫這個方法:
    const isEmpty = (value) => {
    return value === null || value === undefined || value === '';
    };
  • 判斷是否符合特殊規則:在一些電子信箱、電話、發票等,有固定格式的欄位上,可以透過 Regex(正則表達式)來進行檢核,個人覺得除了刷題的需求外,在一般實務開發中不太需要去背 Regex 的一些規則,有在使用一些 AI 工具(chatGPT、copilot)的話,也能快速產生一些規範:
    const basicFormValidator = {
    validateEmail: function(email) {
    const emailRegex = /^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,4}$/;
    return emailRegex.test(email);
    },
    validatePhone: function(phone) {
    const phoneRegex = /^\\d{10}$/;
    return phoneRegex.test(phone);
    },
    validateLandline: function(landline) {
    const landlineRegex = /^\\d{8}$/;
    return landlineRegex.test(landline);
    },
    validatePassword: function(password) {
    // 設定你的密碼驗證規則,這只是一個範例
    const passwordRegex = /^(?=.*[A-Za-z])(?=.*\\d)[A-Za-z\\d]{8,}$/;
    return passwordRegex.test(password);
    }
    };

    // 使用範例
    const email = 'test@example.com';
    const phone = '1234567890';
    const landline = '23456789';
    const password = 'P@ssw0rd';

    console.log(basicFormValidator.validateEmail(email)); // true
    console.log(basicFormValidator.validatePhone(phone)); // true
    console.log(basicFormValidator.validateLandline(landline)); // true
    console.log(basicFormValidator.validatePassword(password)); // true

以上只能檢核最基本的資料正確性,避免在打 API 時,出現不必要的請求錯誤,至於一些避免攻擊手段的方式,目前還沒有理解到很多,也許之後有機會可以再跟大家分享。

希望今天的文章可以讓大家更加理解前端做表單檢核的重要性與必要性,如果有任何問題都歡迎在下方留言跟我說,我是 Vivian,我們下次見!

留言
avatar-img
Vivian Yeh - 跨領域轉職的軟體工程師
460會員
103內容數
為了追求可以窩在座位上、可以心無旁騖思考問題、座位可以亂七八糟沒關係、不需要到處哈腰點頭跑客戶,不用腳踩十公分、連妝都可以不用化的職場人生,文組少女毅然決然踏上RD的養成日常。
2024/05/23
與 cookie 相比,localStorage 與 sessionStorage 的機制相對單純,兩者皆是瀏覽器中的儲存空間,與 cookie 最大的不同在於:localStorage 與 ⋯⋯
Thumbnail
2024/05/23
與 cookie 相比,localStorage 與 sessionStorage 的機制相對單純,兩者皆是瀏覽器中的儲存空間,與 cookie 最大的不同在於:localStorage 與 ⋯⋯
Thumbnail
2024/05/22
在瀏覽器環境中有許多的儲存空間,想要查看這些空間的話,可以透過「chrome > Dev Tools > Application > Storage」即能進行查看。 瀏覽器內存空間的差異不僅常常被拿來被當作面試考題,在實務開發中更扮演舉足輕重的角色,今天就想透過這系列的文章深度了解這些瀏覽器內存⋯
Thumbnail
2024/05/22
在瀏覽器環境中有許多的儲存空間,想要查看這些空間的話,可以透過「chrome > Dev Tools > Application > Storage」即能進行查看。 瀏覽器內存空間的差異不僅常常被拿來被當作面試考題,在實務開發中更扮演舉足輕重的角色,今天就想透過這系列的文章深度了解這些瀏覽器內存⋯
Thumbnail
2024/02/20
上一篇文章分享了 TypeScript 的定義、前端角色定位,如果你不是很確定「TypeScript 是什麼?」、「TypeScript 作為 JavaScript 的超集,在網頁開發扮演怎麼樣的角色?」這兩個問題的答案,建議可以回到上一篇先了解一下。
Thumbnail
2024/02/20
上一篇文章分享了 TypeScript 的定義、前端角色定位,如果你不是很確定「TypeScript 是什麼?」、「TypeScript 作為 JavaScript 的超集,在網頁開發扮演怎麼樣的角色?」這兩個問題的答案,建議可以回到上一篇先了解一下。
Thumbnail
看更多
你可能也想看
Thumbnail
vocus 慶祝推出 App,舉辦 2026 全站慶。推出精選內容與數位商品折扣,訂單免費與紅包抽獎、新註冊會員專屬活動、Boba Boost 贊助抽紅包,以及全站徵文,並邀請你一起來回顧過去的一年, vocus 與創作者共同留下了哪些精彩創作。
Thumbnail
vocus 慶祝推出 App,舉辦 2026 全站慶。推出精選內容與數位商品折扣,訂單免費與紅包抽獎、新註冊會員專屬活動、Boba Boost 贊助抽紅包,以及全站徵文,並邀請你一起來回顧過去的一年, vocus 與創作者共同留下了哪些精彩創作。
Thumbnail
本文介紹瞭如何在後端系統開發時設計不同表單的簽核流程,包括請假表單和採購表單。以及如何動態生成簽核表單,並建立簽核節點。另外還介紹瞭如何利用繼承來簡化簽核流程的設定。
Thumbnail
本文介紹瞭如何在後端系統開發時設計不同表單的簽核流程,包括請假表單和採購表單。以及如何動態生成簽核表單,並建立簽核節點。另外還介紹瞭如何利用繼承來簡化簽核流程的設定。
Thumbnail
本篇文章分享了前端工程師在 CSS Battle #166 的解題方式,藉由使用 flex 來進行排版,並提供了相關的技術總結。歡迎一起來學習或練習基礎切版的朋友們和作者互動。
Thumbnail
本篇文章分享了前端工程師在 CSS Battle #166 的解題方式,藉由使用 flex 來進行排版,並提供了相關的技術總結。歡迎一起來學習或練習基礎切版的朋友們和作者互動。
Thumbnail
軟體系統的發展歷程大多相似,首重解決基本需求、提供操作介面,進而提升安全性、擴充功能、優化操作。
Thumbnail
軟體系統的發展歷程大多相似,首重解決基本需求、提供操作介面,進而提升安全性、擴充功能、優化操作。
Thumbnail
本篇文章分享了 CSS Battle 的題目 #160 的解法,並講解了對於前端工程師基礎切版的重要性和技術總結。
Thumbnail
本篇文章分享了 CSS Battle 的題目 #160 的解法,並講解了對於前端工程師基礎切版的重要性和技術總結。
Thumbnail
確保沒有遺漏或錯誤 程式的完整資訊資料對於程式設計至關重要。這是因為只有透過完整的資訊,我們才能確保在程式設計中沒有任何遺漏或錯誤。最終,後台管理扮演著管理系統中所有動作和行為是否符合特定標準的重要角色。 採取不符合預期的行動 這種符合性的重要性在於,當我們設計程式時,希望使用者按照預期的方式
Thumbnail
確保沒有遺漏或錯誤 程式的完整資訊資料對於程式設計至關重要。這是因為只有透過完整的資訊,我們才能確保在程式設計中沒有任何遺漏或錯誤。最終,後台管理扮演著管理系統中所有動作和行為是否符合特定標準的重要角色。 採取不符合預期的行動 這種符合性的重要性在於,當我們設計程式時,希望使用者按照預期的方式
Thumbnail
是的,身為前端工程師的基本功!還是需要時不時拿出來打磨一番! 很多大公司的切版與前端是分開的,但不能因為碰不到就不去理解,假如要系統性的調整樣式,那麼你就一定要懂基礎,就好像你要調整微前端的架構,總不能連包板工具的設定都不會吧! 回到正題,這系列文章每個禮拜三都會更新一題CSS Battle的題
Thumbnail
是的,身為前端工程師的基本功!還是需要時不時拿出來打磨一番! 很多大公司的切版與前端是分開的,但不能因為碰不到就不去理解,假如要系統性的調整樣式,那麼你就一定要懂基礎,就好像你要調整微前端的架構,總不能連包板工具的設定都不會吧! 回到正題,這系列文章每個禮拜三都會更新一題CSS Battle的題
Thumbnail
是的,身為前端工程師的基本功!還是需要時不時拿出來打磨一番! 很多大公司的切版與前端是分開的,但不能因為碰不到就不去理解,假如要系統性的調整樣式,那麼你就一定要懂基礎,就好像你要調整微前端的架構,總不能連包板工具的設定都不會吧! 回到正題,這系列文章每個禮拜三都會更新一題CSS Battle的題
Thumbnail
是的,身為前端工程師的基本功!還是需要時不時拿出來打磨一番! 很多大公司的切版與前端是分開的,但不能因為碰不到就不去理解,假如要系統性的調整樣式,那麼你就一定要懂基礎,就好像你要調整微前端的架構,總不能連包板工具的設定都不會吧! 回到正題,這系列文章每個禮拜三都會更新一題CSS Battle的題
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News