[英]Creating a 1337 password checker (javascript)
我正在處理的一些JavaScript出現問題。 目的是檢查輸入的已知錯誤密碼列表。 那部分很簡單。 但隨后它也應該能夠檢查這些密碼的“ 1337”版本。 基本上,它需要能夠檢查密碼中的數字並將其轉換為英語,然后才能通過已知的錯誤密碼功能運行。 我試圖從制作一個leet語音翻譯器中設置一個功能來做到這一點,但是它僅部分起作用,我對原因感到困惑,因為它沒有正確地進行迭代。 出現次數多於一次的字母僅在第一次被替換。 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>
您似乎在遍歷text.length
而不是LettersEnglish.length
或LettersLeet.length
。 這意味着,如果密碼長度短於這些數組的長度,則不會替換其中的所有字符。
@MTCoaster是正確的,因為您要遍歷錯誤的內容。 您將需要如下所示:
for (var i = 0; i < LettersLeet.length; i++) {
text = text.replace(new RegExp(LettersLeet[i], 'g'), LettersEnglish[i]);
}
注意, replace()
調用現在使用正則表達式作為第一個參數,並且使用“ global”標志創建了正則表達式。 這允許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()
。
因為我們有一個已知的錯誤密碼的列表,后來被告知,密碼中只有一個1的實例,這就是我的答案。 為了檢查除L以外的所有字母,我使用了@PeterHerdenborg的答案。
var LettersEnglish1 = ['o', 'e', 'a', 's', 't', 'i'],
LettersLeet = ['0', '3', '4', '5', '7', '1'];
function changeLetters() {
var text = document.getElementById("password").value;
for (var i = 0; i < LettersLeet.length; i++) {
text = text.replace(new RegExp(LettersLeet[i], 'g'), LettersEnglish1[i]);
//console.log(text);
englishPasswords(text);
}
}
function englishPasswords(text) {
var myarr = ["password", "letmein", "dragon", "shadow", "joker"];
var string = (myarr.indexOf(text) > -1);
if (string === true){
document.getElementById("output").innerHTML = text + " is a bad password";
}else{
checkForLs(text);
}
}
function checkForLs(text){
text = text.replace('i','l')
if(text == 'letmein'){
document.getElementById("output").innerHTML = text + " is a bad password";
}else{
document.getElementById("output").innerHTML = text + "thats an acceptable password";
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.