假设我有一个这样的表格:
// JADE
form(action="", method="POST")
select(name="currency")
option(value="EURUSD") EURUSD
option(value="GBPUSD") GBPUSD
option(value="USDCHF") USDCHF
input(type="submit")
# CoffeeScript
sanitizer = require "any sanitizer" # to replace <,>,',", etc.
app.post "/add_currency", (req,res)->
# I use Sequelize for storing data in MySQL
Currency.create(
name: santizer ( req.body.currency )
).success( (created_currency)->
)
好的,我们将得到一个对象:
{
name: "EURUSD"
id: 1
...
}
但是,如果我们在浏览器中加载表单,在 Web Inspector (Chrome: Developer Tools) 中检查select(name="currency")
s option
,并将第一个选项的值从“EURUSD”更改为“SOMETHING WIRED”,表单将通过,我们将拥有对象:
{
name: "SOMETHING WIRED"
id: 1
...
}
...假设事实是,我们在技术上已经用消毒剂过滤了我们的输入!所以,问题是:
1. 如何防止改变输入的预定义值?
2. 如何防止更改输入的名称?
我编写了一个简单的库来检查 select 的响应值是否在发送给客户端的值数组中,但是很难管理。为了防止表单名称更改,我检查发送的输入名称数组是否与从客户端获取的名称完全相同。
PS 另一种解决方案可能是使用预定义的数据库字段,只接受几个值。但是,它不是 Grail,因为选项列表可能是从实际数据库对象动态生成的。