将密码与前端或后端匹配?

2024-06-16 12:00:20 发布

您现在位置:Python中文网/ 问答频道 /正文

有没有人知道检查匹配密码的行业标准或最佳实践(例如Gmail的“密码不匹配”反馈)?它是后端、前端还是客户端流程?还是完全基于其他因素?在

下面是我使用的代码示例(Python with Bottle)注册用户。代码可以工作,但是我不确定是否应该从后端提供一个flash message(它返回“Passwords dot 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)

Tags: 代码密码getrequestmatchjsnotforms
2条回答

您需要区分两种情况:

  1. 如果不在后端使用数据库或任何不可共享的技术,就无法验证值。在这种情况下,您唯一的可能就是在后端检查它(例如通过Ajax调用或通过WebSockets进行通信)。这种验证的例子有:用户名/密码验证或任何需要连接到数据库的东西,一种用无法发布的逻辑检查值的专有算法
  2. 您可以验证值,而不必先在后端(数据库)中检查它。在这种情况下,您可以将出于性能原因的检查移动到前端/客户端。您仍然需要保护后端不受不正确值的影响(以防受到攻击、JavaScript损坏等)。此类检查的示例包括电子邮件地址验证、电话号码验证等

对于1,我只会在提交值或键入时使用与后端的常规连接(如果来自后端的响应足够快)。在

对于2,您有几个选项:

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

但是,您的示例包含两个密码的匹配(相等性检查)。这是一个特殊情况,因为不能使用正则表达式检查值的有效性。上述两种情况排除了上述两种解决方案。在

如果您的唯一目的是比较这两个值,我建议复制逻辑。在这种情况下,复制(imho)在某种程度上是合理的,因为检查非常简单,不太可能随着时间的推移而改变。对后端进行检查以完全检查平等性(imho)被夸大了。在

在注册过程中检查两个密码字段是否匹配应该完全通过客户端逻辑来完成。它是为了防止用户错误地在他们的密码中插入错误。服务器端检查是没有意义的,因为你的客户机会阻止它,如果你的用户是一个精通技术的人,什么都用curl来做,那么如果他们搞砸了,那就由他们来做。在

此外,我还将扩展您关于最佳实践的问题。你不应该立即将用户保存在你的数据库,没有他们首先通过一个链接,通常发送到他们的电子邮件,验证它是有效的。记住:不要相信用户提供的任何东西。在

相关问题 更多 >