我在处理一些 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/