在注册新帐户时,网络应用程序通常会询问“安全问题”的答案,例如狗的名字等。
我想通过我们的数据库查找用户只是敲击键盘而不是提供合法答案的情况 - 这是滥用/欺诈帐户的高指标。
“母亲的娘家姓?” 拉克杰弗卡伊
关于我应该如何做这件事的任何建议?
注意:我不仅仅在这些“安全问题答案”上使用正则表达式
“答案”可以是:
使用一些基本的 sql 正则表达式从数据库中选择
使用 python 正则表达式根据需要分析多次
根据需要比较/修剪/评分
这是一个技术问题,而不是哲学问题 ;-)
谢谢!
在注册新帐户时,网络应用程序通常会询问“安全问题”的答案,例如狗的名字等。
我想通过我们的数据库查找用户只是敲击键盘而不是提供合法答案的情况 - 这是滥用/欺诈帐户的高指标。
“母亲的娘家姓?” 拉克杰弗卡伊
关于我应该如何做这件事的任何建议?
注意:我不仅仅在这些“安全问题答案”上使用正则表达式
“答案”可以是:
使用一些基本的 sql 正则表达式从数据库中选择
使用 python 正则表达式根据需要分析多次
根据需要比较/修剪/评分
这是一个技术问题,而不是哲学问题 ;-)
谢谢!
我不会这样做——在我看来,这些问题会削弱安全性,所以作为用户,我总是尝试提供另一个半密码作为答案——对你来说,它会被捣碎。好吧,它被捣碎了,但这正是我想做的。
顺便提一句。我不确定您可以查询答案的事实。由于它们克服了您的密码保护,因此应该像密码一样处理它们=存储为哈希!
编辑:
当我读到这篇文章时,我立刻想起了这个问题;-)
我一直发现人们使用的安全答案比他们使用的密码弱。
安全问题只是安全链中的一个环节——较弱的环节!
IMO,更好的方法是允许用户请求将新密码发送到他们注册的电子邮件 id。这有两个优点。
如果您必须有秘密问题,让他们触发重新生成(永远不要发送用户的密码,重新生成临时的,最好是一次性强制的)密码发送到他们注册的电子邮件 ID - 并且,不要显示一点也不。
另一个技巧是让秘密问题本身成为他们注册的电子邮件 id。
如果他们说得对,您会向该电子邮件 ID发送一个重新生成的临时密码。
没有办法用正则表达式来做到这一点。实际上,我根本想不出一个合理的方法来做到这一点——你会在哪里划定可疑和不可疑之间的界限?这一次,我经常用一个模糊的答案来回答安全问题。毕竟,我母亲的娘家姓并不是最难查的。
您可能最好分析 n-gram 分布,类似于语言检测。
此代码是使用三元组进行语言检测的示例。我的猜测是键盘粉碎三元组非常独特,不会以普通语言出现。
如果您可以找到英文字母对概率列表,您可以使用最少可能的对和不在列表中的对来构建单词不是“真实”英文单词的近似概率。不幸的是,如果你有名字或其他“非单词”,那么你不能强迫它们成为英语单词。
也许你可以检查大量的辅音。例如,在您的示例lakdsjflkaj中,有 2 个元音 ( a ) 和 9 个辅音。通常随机按键时击中元音的概率远低于击中辅音的概率。
Dejunk是一个 Ruby 库,您可以从中汲取灵感。它实现了其他答案中的一些建议。它认为输入是键盘混搭,如果输入:
如果您的问题与真实的人名有关,这是不可能的。考虑用罗马字符输入的亚洲名字;他们很可能会绊倒您提出的任何过滤器,但仍然是完全合法的。
您可以寻找在语音上没有意义的模式。如:
'q' 后面没有'u'。
自卫队
qwer
zxcv
asdlasd
基本上,试着在你自己的键盘上捣碎,看看你得到了什么,然后把它插入你的过滤器。还要插入各种语法规则。但是,由于您要处理的是名称,因此您总是会得到带有奇怪名称的“那个人”,这会导致误报。
而不是正则表达式,为什么不直接与已知良好值的列表进行比较呢?例如,将母亲的娘家姓与人口普查数据进行比较,或者将宠物名与您可以在网上找到的任何宠物名列表进行比较。对于这个更简单的版本,只需对输入的任何内容进行谷歌搜索。合法的名称应该有很多结果,而键盘混搭应该会产生很少的结果(如果有的话)。
与任何其他方法一样,您仍然需要处理误报。