【发布时间】:2017-05-11 17:35:41
【问题描述】:
我正在编写一个实现用户管理系统的网站,我想知道我必须考虑哪些有关表单处理的最佳实践。
尤其是性能、安全性、搜索引擎优化和用户体验对我来说很重要。当我研究它时,我遇到了几个问题,但我没有找到完整的节点/快速代码 sn-p 在那里我可以弄清楚我下面的所有问题。
用例:有人要更新他的个人资料的生日。现在我正在向同一个 URL 发出 POST 请求以处理该页面上的表单,并且 POST 请求将响应 302 重定向到同一个 URL。
有关表单处理的一般问题:
- 我应该为表单处理执行 POST 请求 + 302 重定向还是其他类似 AJAX 请求的操作?
- 我应该如何处理无效的 FORM 请求(例如无效的登录,或注册期间电子邮件地址已被使用)?
表达有关表单处理的具体问题:
我假设在将任何内容插入我的数据库之前,我需要清理和验证服务器端的所有表单字段。你会怎么做?
我阅读了一些关于 CSRF 的内容,但我从未实施过 CSRF 保护。我也很高兴在代码 sn-p 中看到这一点
在使用 Express 处理表单时,我是否需要注意任何其他可能的漏洞?
示例 HTML/Pug:
form#profile(method='POST', action='/settings/profile')
input#profile-real-name.validate(type='text', name='profileRealName', value=profile.name)
label(for='profile-real-name') Name
textarea#profile-bio.materialize-textarea(placeholder='Tell a little about yourself', name='profileBio')
| #{profile.bio}
label(for='profile-bio') About
input#profile-url.validate(type='url', name='profileUrl', value=profile.bio)
label(for='profile-url') URL
input#profile-location.validate(type='text', name='profileLocation', value=profile.location)
label(for='profile-location') Location
.form-action-buttons.right-align
a.btn.grey(href='' onclick='resetForm()') Reset
button.btn.waves-effect.waves-light(type='submit')
示例路由处理程序:
router.get('/settings/profile', isLoggedIn, profile)
router.post('/settings/profile', isLoggedIn, updateProfile)
function profile(req, res) {
res.render('user/profile', { title: 'Profile', profile: req.user.profile })
}
function updateProfile(req, res) {
var userId = req.user._id
var form = req.body
var profile = {
name: form.profileRealName,
bio: form.profileBio,
url: form.profileUrl,
location: form.profileLocation
}
// Insert into DB
}
注意:非常感谢一个完整的代码 sn-p,它负责所有适用于给定示例的表单处理最佳实践。我可以使用任何公开可用的快速中间件。
【问题讨论】:
标签: node.js security express body-parser