使用Express-Validator清理Express中的輸入

您已經了解瞭如何驗證來自外部世界的輸入到您的Express應用程序。

運行面向公眾的服務器時,您很快就會學到一件事:永遠不要信任輸入。

即使您進行了消毒並確保人們不能使用客戶端代碼輸入怪異的東西,您仍然會受到人們使用工具(甚至只是瀏覽器devtools)直接向您的端點進行POST的約束。

或者,機器人會嘗試人類已知的各種利用方式。

您需要做的是清理您的輸入。

express-validator包裹您已經用來驗證輸入的內容,也可以方便地用於執行清理操作。

假設您的POST端點接受名稱,電子郵件和年齡參數:

const express = require('express')
const app = express()

app.use(express.json())

app.post(’/form’, (req, res) => { const name = req.body.name const email = req.body.email const age = req.body.age })

您可以使用以下方法驗證它:

const express = require('express')
const app = express()

app.use(express.json())

app.post(’/form’, [ check(‘name’).isLength({ min: 3 }), check(‘email’).isEmail(), check(‘age’).isNumeric() ], (req, res) => { const name = req.body.name const email = req.body.email const age = req.body.age })

您可以通過在驗證方法之後使用管道傳遞消毒方法來添加消毒:

app.post('/form', [
  check('name').isLength({ min: 3 }).trim().escape(),
  check('email').isEmail().normalizeEmail(),
  check('age').isNumeric().trim().escape()
], (req, res) => {
  //...
})

在這裡,我使用了以下方法:

  • trim()在字符串的開頭和結尾處修剪字符(默認情況下為空白)
  • escape()取代<>&'"/及其相應的HTML實體
  • normalizeEmail()規範化電子郵件地址。接受幾種小寫電子郵件地址或子地址的選項(例如[email protected]

其他消毒方法:

  • blacklist()刪除出現在黑名單中的字符
  • whitelist()刪除白名單中未出現的字符
  • unescape()用替換HTML編碼的實體<>&'"/
  • ltrim()類似於trim(),但僅修剪字符串開頭的字符
  • rtrim()類似於trim(),但僅修剪字符串末尾的字符
  • stripLow()刪除通常不可見的ASCII控製字符

強制轉換為格式:

  • toBoolean()將輸入字符串轉換為布爾值。除“ 0”,“ false”和“”以外的所有內容均返回true。在嚴格模式下,只有'1'和'true'返回true
  • toDate()將輸入字符串轉換為日期,如果輸入不是日期,則將其轉換為null
  • toFloat()將輸入字符串轉換為浮點數;如果輸入不是浮點數,則將其轉換為NaN
  • toInt()將輸入字符串轉換為整數,如果輸入不是整數,則將其轉換為NaN

與自定義驗證器一樣,您可以創建自定義消毒劑。

在回調函數中,您只需返回已清理的值:

const sanitizeValue = value => {
  //sanitize...
}

app.post(’/form’, [ check(‘value’).customSanitizer(value => { return sanitizeValue(value) }), ], (req, res) => { const value = req.body.value })

免費下載我的Express.js手冊


更多速成教程: