javascript - 创建一个 1337 密码检查器 (javascript)

标签 javascript html

我在处理一些 javascript 时遇到问题。目的是检查已知错误密码列表的输入。那部分很简单。但是它也应该能够检查这些密码的“1337”版本。基本上它需要能够检查密码中的数字并将其转换为英文,然后运行已知的错误密码功能。我试图设置一个函数来执行此操作 Making a leet speak translator但它只是部分工作,我很困惑为什么,因为它没有正确迭代。出现多次的字母只会在第一次被替换。还有 l 或 i 是相同数字的问题。我希望有人能够看一下吗?

<script>    
var LettersEnglish = 
    new Array('o', 'i', 'l', 'e', 'a', 's', 't');
var LettersLeet = 
    new Array('0', '1', '1', '3', '4', '5', '7');

function changeLetters() { // change all letters
    var text = document.getElementById("password").value;
    for (var i = 0; i < text.length; i++) {
        text = text.replace(LettersLeet[i], LettersEnglish[i]);
        }englishPasswords(text);
}

function englishPasswords(convertedstring) {
    var myarr = ["password", "letmein", "dragon", "shadow", "joker"];
    var string = (myarr.indexOf(convertedstring) > -1);
    if (string === true){
        document.getElementById("output").innerHTML = convertedstring + " is a bad password";
    }else{
        document.getElementById("output").innerHTML = convertedstring + " is an acceptable password";
    }
}
</script> 

最佳答案

@MTCoaster 是正确的,因为您迭代的是错误的东西。你需要这样的东西:

for (var i = 0; i < LettersLeet.length; i++) {
  text = text.replace(new RegExp(LettersLeet[i], 'g'), LettersEnglish[i]);
}

请注意,replace() 调用现在使用正则表达式作为第一个参数,并且正则表达式是使用“全局”标志创建的。这允许 replace() 替换所有出现的匹配项。按照您的调用方式,将字符串作为第一个参数,只会替换第一个出现的地方。

关于 i/l 映射,您并不是将它们都映射到 1,而是相反,在检查错误密码时,您需要将 1 同时视为 i 和 l。 1 不可能同时映射到两者。一个简单的方法可能是:

var LettersEnglish1 = 
    new Array('o', 'i', 'e', 'a', 's', 't');
var LettersEnglish2 = 
    new Array('o', 'l', 'e', 'a', 's', 't');
var LettersLeet = 
    new Array('0', '1', '3', '4', '5', '7');

然后,在 changeLetters() 中:

var text1 = document.getElementById("password").value,
    text2 = text;
for (var i = 0; i < LettersLeet.length; i++) {
  text1 = text1.replace(new RegExp(LettersLeet[i], 'g'), LettersEnglish1[i]);
  text2 = text2.replace(new RegExp(LettersLeet[i], 'g'), LettersEnglish2[i]);
}
//Now check both text1 and text2 for validity

不过,完整的解决方案可能应该检查 i 和 l 的所有可能排列。例如,如果密码是 1n1t1a1,则有 2^4 (16) 个不同的替换密码需要检查。

最后,一个风格建议:

var LettersEnglish1 = 
    new Array('o', 'i', 'e', 'a', 's', 't');
var LettersEnglish2 = 
    new Array('o', 'i', 'l', 'e', 'a', 's', 't');
var LettersLeet = 
    new Array('0', '1', '3', '4', '5', '7');

通常写成

var LettersEnglish1 = ['o', 'i', 'e', 'a', 's', 't'],
    LettersEnglish2 = ['o', 'l', 'e', 'a', 's', 't'],
    LettersLeet = ['0', '1', '3', '4', '5', '7'];

有些人可能更喜欢使用多个 var 语句,但大多数人使用数组文字语法而不是 new Array()

关于javascript - 创建一个 1337 密码检查器 (javascript),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28316603/

相关文章:

javascript - 需要一个并行指令 Controller ,无需创建父 Controller

javascript - 根据复选框检查删除文本框值

JavaScript 可以 toFixed() 在特定大小后不切割所有内容吗?

html - 当我切换移动菜单时,标题下方的所有网站内容都被下推。任何想法如何解决这个问题?

javascript - 隐藏文本但不在标签jquery中输入

html - TD 的表格和空格的 IE 错误?

javascript - 如何在 ng-grid 中使用 bindonce 指令?

javascript - 如何使用 webpack 4 将tippy.js 导入到 html 页面中?

javascript - codeigniter 无法正确调用 jquery 中的 Controller 功能

javascript - 单击按钮时隐藏和显示图像