iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 25
0
tags: 2019鐵人賽 Laravel Validation

前言

大家還記得我們鐵人賽之前實作了一個簡單的 Day 17 - 會員登入系統,那時後主要是針對資料庫存取、session 使用,但是使用者輸入資料完全沒有驗證,這是一個非常危險的事情。
雖然驗證這檔事,前端、後端都可以作,但是我認為就是都可以作,所以兩邊都要作。

不做驗證會怎樣?

我拿之前做的會員登入系統來舉例。
假設有一個壞蛋,他刻意在註冊帳號的時候,把使用者姓名改成一個 HTML <a> 語法。

那麼我們在歡迎頁面就會變成

可以看到原本要顯示使用者名稱的地方變成了一個連結,這目前還是無害,但是如果導向一個危險的 script ,那麼後果就不堪設想。

那要怎麼驗證?

這邊只針對名字的欄位作舉例:

  1. 檢查請求方法是不是 POST
if ($_SERVER["REQUEST_METHOD"] == "POST") {
}
  1. 避免名字欄位為空
if ($_SERVER["REQUEST_METHOD"] == "POST") {
   if (empty($_POST["name"])) {
     $nameErr = "姓名是必填的";
   }
}
  1. 避免出現字母和空白字符之外的字元
if ($_SERVER["REQUEST_METHOD"] == "POST") {
   if (empty($_POST["name"])) {
     $nameErr = "名字是必填的";
   } else {
     //將特殊字符轉成 HTML 字符實體
     $name = htmlspecialchars($_POST["name"]);
     // 利用正則表示式檢查是否只有字母和空白符
     if (!preg_match("/^[a-zA-Z ]*$/",$name)) {
       $nameErr = "只允許字母和空格"; 
     }
   }
}

大家可以看到,當你有一個驗證需求,就要多寫一個 if 判斷式,這是無法避免的,但是為了安全,你必須作!

Laravel 提供極簡單的驗證方法

一樣,我們把剛剛那段改成 Laravel 的控制器處理,一整個變得簡潔。
至於使用方法,我得說:官方文件寫得非常非常清楚。大家自己去看吧

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;

class RegistController extends Controller
{
    public function store(Request $request)
    {
        $validator = Validator::make(
        $request->all(),
            [
                'account' => ['required', 'regex:/(^[a-zA-Z ]*$)/', 'max:255'],
                'name' => ['required', 'regex:/(^[a-zA-Z ]*$)/', 'max:255'],
                'email' => ['required','regex:/([\w\-]+\@[\w\-]+\.[\w\-]+)/', 'max:255'],
                'phone' => 'required|integer|size:12'
            ],

        );
}

上一篇
Day 24 - Laravel Controller 篇
下一篇
Day 26 - Laravel Database 篇 part I
系列文
新手後端工程師的學習歷程30

尚未有邦友留言

立即登入留言