2019鐵人賽
Laravel
Validation
大家還記得我們鐵人賽之前實作了一個簡單的 Day 17 - 會員登入系統,那時後主要是針對資料庫存取、session 使用,但是使用者輸入資料完全沒有驗證,這是一個非常危險的事情。
雖然驗證這檔事,前端、後端都可以作,但是我認為就是都可以作,所以兩邊都要作。
我拿之前做的會員登入系統來舉例。
假設有一個壞蛋,他刻意在註冊帳號的時候,把使用者姓名改成一個 HTML <a>
語法。
那麼我們在歡迎頁面就會變成
可以看到原本要顯示使用者名稱的地方變成了一個連結,這目前還是無害,但是如果導向一個危險的 script ,那麼後果就不堪設想。
這邊只針對名字的欄位作舉例:
if ($_SERVER["REQUEST_METHOD"] == "POST") {
}
if ($_SERVER["REQUEST_METHOD"] == "POST") {
if (empty($_POST["name"])) {
$nameErr = "姓名是必填的";
}
}
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 的控制器處理,一整個變得簡潔。
至於使用方法,我得說:官方文件寫得非常非常清楚。大家自己去看吧
<?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'
],
);
}