輸入驗證
驗證事例
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
,而不是產生錯誤