前端还是后端匹配密码?

Matching Passwords with Front-End or Back-End?

是否有人知道有关检查匹配密码的行业标准或最佳实践的信息(例如 Gmail 的 "passwords do not match" 反馈”)?它是后端、前端还是客户端流程?还是完全基于其他因素?

这是我正在使用的代码示例(Python 和来自后端的 Bottle) to sign up a user. The code works, but I am unsure whether I should provide a flash message(returns "Passwords do not match")或者它会使用 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)

你需要区分两种情况:

  1. 如果不使用数据库或 back-end 中的任何 non-sharable 技术,您将无法验证该值。在这种情况下,您唯一的可能是在 back-end 中检查它(例如 Ajax 调用或通过 WebSockets 进行通信)。这种验证的示例是:username/password 验证或任何需要连接到数据库的东西,一种用于检查具有无法发布的逻辑的值的专有算法
  2. 您无需先在 back-end(数据库)中检查即可验证该值。在这种情况下,出于性能原因,您可以将检查移至 front-end/client 端。您仍然必须保护 back-end 免受错误值的影响(在受到攻击、损坏 JavaScript 等的情况下)。这种检查的示例例如电子邮件地址验证,phone 号码验证等

对于 1,我只会在提交值或键入时使用与 back-end 的常规连接(如果来自 [=46= 的响应] 够快了)。

对于2,您有几种选择:

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

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

如果您的唯一目的是比较这两个值,我建议您复制逻辑。在这种情况下(恕我直言)复制是有道理的,因为检查非常简单,而且不太可能随着时间的推移而改变。对 back-end 进行检查以仅检查是否相等(恕我直言)被夸大了。

在注册过程中检查两个密码字段是否匹配应该完全用 client-side 逻辑来完成。提供它是为了防止用户错误地将拼写错误插入他们的密码。 server-side 检查毫无意义,因为您的客户会阻止它,并且如果您的用户是精通技术的人,他会使用 curl 做所有事情,那么如果他们搞砸了,那就由他们承担。

另外,我将详细说明您关于最佳做法的问题。你不应该立即将用户保存在你的数据库中,除非他们首先通过 link 验证,通常发送到他们的电子邮件,它是有效的。请记住:永远不要相信用户提供的任何东西。