lapis的輸入驗證

youyu歲月發表於2019-02-16

輸入驗證

驗證事例

Lapis 附帶了一組用於處理外部輸入的校驗器。這裡有一個簡單的例子:

local lapis = require("lapis")
local app_helpers = require("lapis.application")
local validate = require("lapis.validate")

local capture_errors = app_helpers.capture_errors

local app = lapis.Application()

app:match("/create-user", capture_errors(function(self)
  validate.assert_valid(self.params, {
    { "username", exists = true, min_length = 2, max_length = 25 },
    { "password", exists = true, min_length = 2 },
    { "password_repeat", equals = self.params.password },
    { "email", exists = true, min_length = 3 },
    { "accept_terms", equals = "yes", "You must accept the Terms of Service" }
  })

  create_the_user(self.params)
  return { render = true }
end))


return app

assert_valid 接受兩個引數,第一個是要被驗證的參數列,第二個是一個陣列表,它是要要執行驗證的列表。每個驗證的格式如下

{ Validation_Key, [Error_Message], Validation_Function: Validation_Argument, ... }

上述的Validation_Key 是從正在驗證的表中提取的鍵。

可以提供任何數量的驗證函式。如果驗證函式需要多個引數,則可以傳遞一個陣列表

第二個位置的 Error_Message 是可選的。如果提供,它將被用來當作驗證失敗後的錯誤訊息,而不是使用預設生成的。由於 Lua 表的工作方式,它也可以在驗證函式之後提供,如上例所示。

驗證函式

exists: true : 檢查值是否存在,並且不是一個空字串
file_exists: true : 檢查值是否為檔案上傳
min_length: Min_Length : 值必須至少為 Min_Length 個字元
max_length: Max_Length : 值最多必須為 Max_Length 個字元
is_integer: true : 值匹配整數模式
is_color: true : 值匹配 CSS 的十六進位制顏色(例如#1234AA
is_file: true : 值要是一個上傳的檔案
equals: String : 值要等於 xxx
type: String : 值要是 String 型別
one_of: {A, B, C, ...} : 值要等於陣列表中的其中一個元素

建立自定義驗證器

自定義驗證器可以這樣定義:

local validate = require("lapis.validate")

validate.validate_functions.integer_greater_than = function(input, min)
  local num = tonumber(input)
  return num and num > min, "%s must be greater than " .. min
end

local app_helpers = require("lapis.application")
local capture_errors = app_helpers.capture_errors

local app = lapis.Application()

app:match("/", capture_errors(function(self)
  validate.assert_valid(self.params, {
    { "number", integer_greater_than = 100 }
  })
end))

手動驗證

除了 assert_valid ,還有一個有用的驗證函式:

local validate = require("lapis.validate").validate

validate(object,validation) – 使用與 assert_valid 完全相同的引數,但在失敗時返回錯誤或 nil ,而不是產生錯誤

相關文章