我们有以下用例:
用户可以通过填写身份验证表,填写自己的id,名字,姓氏和道布来自助注册商业账号。ID是只有用户提前知道的东西。用户有5次尝试匹配他们的所有信息
我们计划在存储验证尝试的数据库中维护几个表
Table 1 columns: id, attempts
Table 2 columns: id, fname, lname, dob
表1和表2具有一对多关系。这是一个例子,说明如果用户在锁定之前5次尝试猜测名字、姓氏和道布,会发生什么。应用程序检查表1的尝试列,如果特定id的值为5或大于5,则(具有该特定id的)用户帐户将被视为锁定。
table 1
id attempts
1234 5
table 2
id fname lname dob
1234 john doe 19900101
1234 jane doe 19900101
1234 jason doe 19900101
1234 john dae 20010102
1234 roger smith 19960101
上述方法的问题在于,我们只通过id来跟踪失败的尝试。如果用户试图更改id并进行攻击怎么办?通过保持名字,姓氏和道布相同,并猜测id?
也许我需要重新考虑验证表的设计和我的方法来解决用户试图猜测id的问题??或者,有没有更好的方式来思考这个问题?
编辑:这是一个带有前端客户端的REST Api url。所以验证码可能不会保护API??
发布于 2016-07-13 00:46:56
您说得对,"secret“ID添加的安全价值很小,因为它是可以被暴力强制的参数。如果攻击者知道第一个,也就是最后一个,道布,那么他们就可以遍历it,直到它验证。
更好的方法是:在来自某个地址的5次无效尝试后,锁定一个IP地址。这防止了来自一台(或几台)计算机的幼稚类型的蛮力强迫。
最好:为了防止僵尸网络或自动化系统以脚本方式进行暴力强制,然后使用a 是强制人类注册的传统安全模式。
如果ID是“秘密”,那么您还应该确保它足够长(例如,不仅仅是四位数)。也许8个字母数字可以为您在这里愿意容忍的风险级别提供足够的复杂性?取决于您的风险承受能力和系统/数据的敏感度。
编辑:要解决保护REST API的问题...如果您希望只允许来自授权GUI的rest API提交,那么您可以使用由GUI提交的nonce,然后由REST服务进行验证。(类似于CSRF保护。)如果您希望允许从其他程序立即提交到API,这基本上是促进暴力破解攻击的秘诀。大多数主要的在线服务都不提供这样的注册API。但您仍然可以使用长/复杂ID和锁定IP地址。
https://stackoverflow.com/questions/38312644
复制