Ruby中实现密码与禁用列表(denylist)数组校验的方法——Web应用密码禁用列表扩展问题
如何在Ruby中实现密码禁用列表(Denylist)校验
我来帮你解决这个问题!你当前的代码问题出在禁用列表的校验逻辑上,下面是正确的实现方式和问题分析:
问题根源
你修改后的代码里,password != ['P@ssword1', ...].include? 存在两个关键错误:
include?是数组的实例方法,必须传入要检查的元素(也就是password),否则无法正确执行查找- 逻辑判断搞反了:我们需要确保密码不在禁用列表中,应该用取反的
!数组.include?(password),而不是password != ...
正确实现代码
首先推荐把禁用列表单独抽出来,这样后续维护禁用密码会更方便:
def correct_password_format(password) # 定义禁用密码列表,集中管理更易维护 password_denylist = [ 'P@ssword1', 'shabixuege!@#', 'P@$$W0rd0123', 'P@ssw0rd5tgb', 'adminbigdata', 'Pa$$w0rdp!@#', 'adm1nistrator1', 'administrator!@#$' ] # 组合所有校验条件:原格式校验 + 不在禁用列表中 password.count('0-9').positive? && !password.match(/[^A-Za-z0-9]/).nil? && password.count('A-Z').positive? && password.count('a-z').positive? && password.length >= 8 && !password_denylist.include?(password) end
优化建议
如果这个方法会被频繁调用,或者禁用列表很长,推荐把禁用列表定义为常量并冻结,避免每次调用方法都重新创建数组,提升性能:
# 定义为常量并冻结,防止意外修改,同时复用数组实例 PASSWORD_DENYLIST = [ 'P@ssword1', 'shabixuege!@#', 'P@$$W0rd0123', 'P@ssw0rd5tgb', 'adminbigdata', 'Pa$$w0rdp!@#', 'adm1nistrator1', 'administrator!@#$' ].freeze def correct_password_format(password) password.count('0-9').positive? && !password.match(/[^A-Za-z0-9]/).nil? && password.count('A-Z').positive? && password.count('a-z').positive? && password.length >= 8 && !PASSWORD_DENYLIST.include?(password) end
如果禁用列表非常庞大(比如上百个以上),可以用Set来存储,因为Set#include?的查找效率是O(1),比数组的O(n)更快:
require 'set' PASSWORD_DENYLIST = Set.new([ 'P@ssword1', 'shabixuege!@#', # ...其他禁用项 ]).freeze def correct_password_format(password) # ...其他校验条件 !PASSWORD_DENYLIST.include?(password) end
内容的提问来源于stack exchange,提问作者Japie Van schalkwyk
相关产品推荐
相关产品推荐

