匹配密码与前端或后端?

时间:2017-02-12 17:01:38

标签: javascript python validation client-side

是否有人有关于检查匹配密码的行业标准或最佳做法的任何信息(例如Gmail的“密码不匹配”反馈“)?它是后端,前端还是客户端流程?或者它完全基于其他因素吗?

以下是我正在使用的代码示例(带有Bottle的Python)来注册用户。代码有效,但我不确定是否应该从后端提供flash message(返回“密码不匹配”)或者使用像JS这样的东西会更好吗?我知道有一些脚本可以验证这一点,但它们都是JS。我的问题不是如何使用JS,但这是首选的方法。

@route('/suser', method='POST')
def sign_suser():
    cemail = request.forms.get('semail')
    cpassword1 = request.forms.get('spass1')
    cpassword2 = request.forms.get('spass2')
    ctype = request.forms.get('stype')
    if cpassword1 != cpassword2:
        return "<p>Passwords do not match</p>"
    else:
        pwhash = crypt(cpassword1)
        connection = sqlite3.connect("whatever.db")
        cursor_v = connection.cursor()
        cursor_v.execute("insert into users (cemail, cpassword, atype) values (?,?,?)", (cemail,pwhash,ctype))
        connection.commit()
        cursor_v.close()
        info = {'status': 'User Added',
                'type': 'success'}
        return template('whatever',info)

2 个答案:

答案 0 :(得分:16)

在注册过程中检查两个密码字段是否匹配应该完全由客户端逻辑完成。它是为了防止用户错误地在其密码中插入拼写错误而提供的。服务器端检查是没有意义的,因为你的客户端会阻止它,如果你的用户是一个技术精明的人,用curl做所有事情,那么如果他们陷入困境就会在他们身上。

此外,我将扩展您关于最佳做法的问题。如果没有用户首先通过链接进行验证(通常是发送到他们的电子邮件),则不应立即将用户保存在数据库中。请记住:永远不要相信用户提供的任何内容。

答案 1 :(得分:-1)

您需要区分两种情况:

  1. 如果不在后端使用数据库或任何不可共享的技术,则无法验证该值。在这种情况下,您唯一的可能性是在后端检查它(例如通过Ajax调用或通过WebSockets进行通信)。此类验证的示例包括:用户名/密码验证或需要连接到数据库的任何内容,用于检查具有无法发布的逻辑的值的专有算法
  2. 您可以在不在后端(数据库)中首先检查值的情况下验证该值。在这种情况下,您可以将性能检查的检查移至前端/客户端。您仍然必须保护后端免受不正确的值(如果发生攻击,损坏的JavaScript等)。此类检查的示例包括:电子邮件地址验证,电话号码验证等。
  3. 对于 1 ,我只会在提交值或键入时使用常规连接到后端(如果后端的响应足够快)。

    对于 2 ,您有以下几种选择:

    • 1 中执行此操作。在提交时或在输入期间进行后端检查。这可能会有一些性能问题(主要是如果您在按键时检查它)。如果您在提交后进行检查,则验证不是实时的。
    • 在前端和后端进行单独验证。如果你在做。这是推荐。您正在复制前端和后端之间的代码。尽量避免使用它。
    • 使用前端和后端的共享验证模式执行此操作。这是我推荐的验证值的方法。如果使用正则表达式(正则表达式)进行检查,则此验证效果最佳。后端有一个Map()模式,通过前端接口提供。最初在加载Web应用程序时加载模式,然后在应用程序的运行时期间存在这些模式。这可以确保后端和前端的验证始终相同。

    然而,您的示例包含两个密码的匹配(相等检查)。这是一种特殊情况,因为您无法使用正则表达式来检查值的有效性。这排除了上面推荐的案例,并留下了另外两个提到的解决方案。

    如果您的唯一目的是比较这两个值,我建议复制逻辑。在这种情况下复制(imho)有点合理,因为检查非常简单并且不可能随时间改变。对后端进行检查以检查是否相等是(imho)夸大其词。