Porównywanie ciągu znaków za pomocą indexof

0

Hej

Chciałbym sprawdzać i porównywać ciąg znaków które mam w name z passwordem, obecnie działa że porównuje całego stringa

jQuery("#check").click(function () {

    var str = jQuery("#name").val();
    var needle = jQuery("#password").val();
    var test = str.indexOf(needle);

    if (str === needle) {
        jQuery(".error").show();
    }
})

Ale jak mogę porównywać ciąg 3 znaków? Np. name jest Tomasz to żeby sprawdzało czy hasło nie jest Tom lub Asz

0

W JavaScripcie można budować dynamiczne regexy

https://developers.google.com/web/updates/2015/01/ES6-Template-Strings
https://developer.mozilla.org/pl/docs/Web/JavaScript/Reference/Global_Objects/RegExp

Mogę Ci pokazać przykład w czystym JavaScripcie, a ty sobie dopasujesz to pod jQuery

const name = 'Tomasz';
const password = 'tOm123!qwerty';
const regexp = new RegExp(`^${name.slice(0, name.length / 2)}`, 'i'); // stworzy nam regex, który sprawdza, czy tekst zaczyna się od fragmentu "tom" i przy porównaniu zignoruje wielkość liter

if (regexp.test(password)) {
  console.log('Hasło zaczyna się od fragmentu tom'); // powinien wykonać się ten fragment
} else {
  console.log("Hasło jest w porządku");
}
1

@Xarviel: Podpowiedź fajna, ale trochę niepoprawna, a w porywach niebezpieczna.

Niepoprawna - bo jeżeli np. name będzie "^Tomasz" i hasło "^tom" to nam zwyczajnie nie zadziała - stwierdzi, że hasło jest w porządku.
Niepoprawna - bo jeżeli będzie tam (Tomasz i (tom to wyrzuci wyjątek i kod się w ogóle nie wykona
Niebezpieczna - bo jeżeli ten sam kod użylibyśmy w Node.JS to właśnie zrobiliśmy sobie dziurę ReDoS

Trzeba tam zdecydowanie dorzucić zabezpieczenie przed wrzucaniem w środek wyrażenia regularnego znaków specjalnych. Wydaje mi się, że ta odpowiedź przeczytana i zrozumiana w całości powinna dać nam odpowiedź jak zrobić to poprawnie - aczkolwiek nie zagłębiałem się w to aż tak i osobiście nie lubię wstrzykiwania czegokolwiek w RegExpy - co chwila muszę aktualizować npmowe paczki w moich projektach, bo co chwila jest w jakiejś właśnie ReDoS, a w najgorszych przypadkach aktualizuję tą samą paczkę kilka dni z rzędu, bo co chwile jest poprawiana i wychodzi nowy problem - co sugeruje mi, że jest tu dużo potencjalnych problemów i rozwiązanie ze Stacka również może być niepełne.

Także wracając do problemu - ja bym raczej poszedł drogą: oba stringi toLowerCase(), pociąć taki name na kawałki i sprawdzać czy któryś kawałek nie znajduje się w haśle. Ogółem dość upierdliwa UXowo sprawa, bo login Tomek i hasło TomekMaNajbe55pieCzniej$heHa$loNASWIEcie!!!66 jest całkiem dobrą parą :) Ale to tak w ramach rozważań poza tematem. Czas na przykład:

    const name = '(Tomasz';
    const password = '(tOm123!qwerty';

    const fragments = name.toLowerCase().match(/.{3}/g);
    const lowerPassword = password.toLowerCase();

    const loginIncluded = fragments.some(fragment => lowerPassword.includes(fragment));
    if (loginIncluded) {
        console.log("Hasło zawiera fragment loginu")
    }
    else {
        console.log("Hasło nie zawiera fragmentu loginu")
    }
1

@dzek69 Dzięki za informację i zgadzam się ze wszystkim, ale jakoś wcześniej nie wziąłem tego pod uwagę :)

Jeśli name, może przyjmować znaki specjalne to faktycznie rozwiązanie nie jest najlepsze i na pewno trzeba byłoby jakoś się zabezpieczyć, bo ten kod miał być jedynie prostym przykładem jak działają regexy.

0

Nie wiem ale to jest jakiś masowy trolling że ludzie w tym dziale wklejają kody z jQuery w 2021?

1 użytkowników online, w tym zalogowanych: 0, gości: 1