注册新帐户时,网络应用程序通常会询问“安全问题”的答案,即狗的姓名等。
我想通过我们的数据库查找用户只是捣乱键盘而不是提供合法答案的实例 - 这是滥用/欺诈帐户的高指标。
“母亲的娘家姓?” lakdsjflkaj
有关我应该如何做的任何建议吗?
注意:我不仅仅在这些“安全问题解答”中使用正则表达式
'答案'可以是:
使用一些基本的sql正则表达式从数据库中选择
使用python regexes
根据需要进行比较/修剪/评分
这是一个技术问题,而非哲学问题 ; - )
谢谢!
答案 0 :(得分:39)
我不会这样做 - 在我看来这些问题削弱了安全性,所以作为一个用户我总是尝试提供另一个半密码作为答案 - 对你来说它想要捣碎。嗯,它是捣碎的,但这正是我想要做的。
顺便说一下。我不确定你可以查询答案的事实。由于他们克服了你的密码保护,他们应该像密码一样处理=存储为哈希!
修改强>
当我阅读this article时,我立即想起了这些问题; - )
答案 1 :(得分:12)
我总是发现人们将安全答案弱于他们使用的密码 安全问题只是安全链中的另一个环节 - 链接较弱!
IMO,更好的方法是允许用户请求发送到其注册电子邮件ID的新密码。这有两个好处。
如果您必须有秘密问题,请让他们触发重新生成(永不发送用户密码,重新生成临时,最好是一次性强制)密码发送到他们注册的电子邮件ID - 并且,完全没有表现出来。
另一个诀窍是将自己的注册电子邮件ID 的秘密问题提交给他们 如果他们说得对,您可以向该电子邮件ID发送重新生成的临时密码。
答案 2 :(得分:6)
使用正则表达式无法做到这一点。实际上,我根本无法想出一个合理的方法 - 你会在哪里划出可疑和不可挽回的界线?我曾经一次经常用一个模糊的答案回答安全问题。毕竟,我母亲的婚前姓不是最难找到的。
答案 3 :(得分:5)
您可能最好分析n-gram分布,类似于语言检测。
This code是使用trigrams进行语言检测的示例。我的猜测是键盘粉碎三卦非常独特,不会出现在普通语言中。
答案 4 :(得分:4)
如果您可以找到英文字母对概率列表,则可以使用列表中不存在的最不可能的对和对来构造单词不是“真实”英语单词的近似概率。不幸的是,如果你有名字或其他“非单词”,那么你不能强迫它们成为英语单词。
答案 5 :(得分:4)
也许你可以查看丰富的辅音。例如,在您的示例lakdsjflkaj
中,有2个元音(a)和9个辅音。通常,当随机按键时击中元音的概率远低于击中辅音的概率。
答案 6 :(得分:3)
Dejunk是一个Ruby库,您可以从中吸取灵感。它在其他答案中实现了一些建议。如果输入:
,它认为输入是键盘糖化答案 7 :(得分:2)
您可以在开始时检查大写字母......这肯定会给您带来一些误报。
快速谷歌给了我this,您可以将每个与该列表中的名称进行比较。
显然只适用于你所说的安全问题。
您是否也见过这个:
下次我实施安全问题时,我会努力思考。
答案 8 :(得分:2)
如果你的问题与真实的人名有关,那就不可能了。考虑用罗马字符键入的亚洲名字;他们可能很好地绊倒你提出的任何过滤器,但仍然完全合法。
答案 9 :(得分:0)
你可以寻找语音上没有意义的模式。如:
'q'后面没有'u'。
ASDF
QWER
ZXCV
asdlasd
基本上,尝试在自己的键盘上进行混搭,看看你得到了什么,并将其插入过滤器中。还插入各种语法规则。然而,由于它是你正在处理的名字,你总是会得到那个带有奇怪名字的“那个人”,这会导致误报。
答案 10 :(得分:0)
为什么不与已知的好的值列表进行比较,而不是正则表达式?例如,将母亲的婚前姓名与人口普查数据或宠物名称与您可以在线查找的任何宠物名称列表进行比较。对于更简单的版本,只需对输入的内容进行Google搜索即可。合法的名称应该有足够的结果,而键盘糖化应该导致很少(如果有的话)。
与任何其他方法一样,您仍然需要处理误报。