使用Express处理最佳实践

ken*_*tor 6 security node.js express body-parser

我正在写一个实现用户管理系统的网站,我想知道我必须考虑哪些关于表单处理的最佳实践.

特别是性能,安全性,SEO和用户体验对我来说非常重要.当我处理它时,我遇到了几个问题,我没有找到一个完整的节点/快速代码片段,在那里我可以找出我以下的所有问题.

使用案例:有人将更新其个人资料的生日.现在我正在对同一个URL执行POST请求以处理该页面上的表单,POST请求将使用302重定向到同一URL进行响应.

关于表单处理的一般问题:

  1. 我应该为表单处理执行POST请求+ 302重定向,还是像AJAX请求那样做其他事情?
  2. 我应该如何处理无效的FORM请求(例如,无效登录或电子邮件地址已在注册期间使用)?

表达有关表单处理的具体问题:

  1. 我假设在将任何内容插入我的数据库之前,我需要清理并验证服务器端的所有表单字段.你会怎么做?

  2. 我读了一些关于CSRF的事情,但我从未实施过CSRF保护.我也很高兴在代码片段中看到它

  3. 使用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')
Run Code Online (Sandbox Code Playgroud)

路由处理程序示例:

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
}
Run Code Online (Sandbox Code Playgroud)

注意:我们非常感谢完整的代码片段,其中包含了适用于给定示例的所有表单处理最佳实践.我可以使用任何公开的快速中间件.

Pet*_*ons 3

我应该执行 POST 请求 + 302 重定向来进行表单处理,还是执行其他类似 AJAX 请求的操作?

,自 2004 年左右(基本上自 Gmail 推出以来)以来,获得良好用户体验的最佳实践是通过 AJAX 提交表单,而不是 Web 1.0 全页加载表单 POST。特别是,通过 AJAX 进行错误处理不太可能让用户陷入死胡同的浏览器错误页面,然后遇到后退按钮问题。在这种情况下,AJAX 应该发送一个 HTTP PATCH 请求,以便在语义上最正确,但 POST 或 PUT 也可以完成工作。

我应该如何处理无效的表单请求(例如无效登录,或电子邮件地址在注册期间已被使用)?

无效的用户输入应导致 HTTP400 Bad Request状态代码响应,并在 JSON 响应正文中包含有关特定错误的详细信息(格式因应用程序而异,但一般消息或逐个字段错误是常见主题)

对于已在使用的电子邮件,我使用 HTTP409 Conflict状态代码作为一般错误请求有效负载的更特殊风格。

我假设在将任何内容插入数据库之前,我需要清理并验证服务器端的所有表单字段。你会怎么做?

绝对地。有很多工具。我通常在JSON Schema中为有效请求定义一个架构,并使用 npm 中的库来验证该架构,例如is-my-json-validajv。特别是,我建议尽可能严格:拒绝不正确的类型,或者如果必须的话强制类型,删除意外的属性,尽可能使用小但合理的字符串长度限制和严格的字符串正则表达式模式,当然还要确保您的DB 库属性可防止注入攻击。

我读过一些有关 CSRF 的内容,但我从未实现过 CSRF 保护。

OWSAP节点山羊项目 CSRF 练习是一个很好的起点,可以从易受攻击的应用程序开始,了解并利用该漏洞,然后实施修复(在本例中是直接集成中间件)express.csrf()

使用 Express 处理表单时是否需要注意任何其他可能的漏洞?

是的,通常应用程序开发人员必须理解并积极安全地编码。有很多关于这方面的材料,但当用户输入涉及数据库查询、子进程生成或写回 HTML 时,必须特别小心。可靠的查询库和模板引擎将处理这里的大部分工作,您只需要了解恶意用户输入可能潜入的机制和潜在位置(例如图像文件名等)。