Problem z logowaniem - JavaScript

0

Witam,
Mam problem logowaniem w języku JavaScript.
Otóż po zalogowaniu, użytkownik ma być przeniesiony na stronę index.html

W pliku tablica.js mam utworzone 10 kont
login jako adres email i hasło

Użytkownik jest pytany o login i hasło.
Jaka jest możliwość napisania pętli, która dopasuje dane z tablicy podane przez użytkownika do podanej danej (loginu i hasła)
aby login i hasło było zgodne z danymi w tablicy,

Niestety "inarray" nie działa ponieważ szuka
wszystkich ciągów znaków, więc każde hasło pasuje do każdego loginui na odwrót.
Chciałbym żeby konkretny login był przydzielony do konkretnego hasła.
np. login: [email protected] hasło: 1

Logowanie
http://wklej.org/id/471655/

Plik tablica.js
http://wklej.org/id/471772/

Liczę na waszą pomoc.

Pozdrawiam,
Cramloth

0

nie wiem czy na pewno o to pytasz, ale:

  1. możesz na przykład stworzyć dwie tablice: jedną z loginami, a drugą z hasłami
  2. jeśli wolisz bardziej wysublimowane metody i wiesz jak, to możesz stworzyć obiekt user który zawiera login i hasło i tablicę userów
  3. w poszukiwaniu loginu możesz badać co drugą komórkę tablicy i jeśli login pasuje to sprawdzać hasło za nią

poza tym:

  1. odrobinę bardziej bezpieczne jest nie informowanie potencjalnego atakującego, czy podał niepoprawny login (z poza tabeli), czy hasło, lecz mówienie, że login lub hasło są niepoprawne
  2. oczywiście powyższe nie ma najmniejszego znaczenia jeśli baza kont jest w javascripcie ;p
0

@Cramloth zdajesz sobię sprawę, że javascript wykonuje się po stronie klienta. Czyli całą bazę kont/haseł wysyłasz do klienta. Powiem tak takie logowanie jest śmiechu warte, bo rozwali je przedszkolak. Jeśli chcesz potrenować JS to ok, ale jeśli to ma być jakieś zabezpieczenie, to zapomnij, chyba dla blondynek.
Walidacja loginu i hasła musi następować po stronie serwera, aby dane o wszystkich loginach i hasłach nie lądowały u klienta.

0

Dzięki za rady.
Wiem, że trzymanie haseł w tablicach nie jest mądrym wyborem, ale nie jest to mój wymysł :)
Nie zależy mi tu na jakimkolwiek bezpieczeństwie - po prostu żeby działało ;)

Mam takie pytanie: jak połączyć dwie tablice aby login był wczytywany z jednej, a hasło z drugiej ?

0

Najn, najn, najn, szjse!!! Co to za pomysł?
Powinna być jedna tablica z dwoma polami login i password. Czy też tablicę dwuwymiarową.
Oczywiście można mieć dwie tablice (wektory) i zakładać że login pod indeksem 1 pasuje do hasła po indexem 1 (czy też odwrotnie :]) - tylko że to troche głupie.

https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array

0
Cramloth napisał(a)

...Wiem, że trzymanie haseł w tablicach nie jest mądrym wyborem, ale nie jest to mój wymysł :)
Nie zależy mi tu na jakimkolwiek bezpieczeństwie - po prostu żeby działało ;)...

Nie wiem czy do końca rozumiesz co przedmówcy chcą ci powiedzieć. Chodzi o to, że kod JavaScript jest wykonywany po stronie klienta czyli => jest on najpierw w niezmienionej postaci przesyłany do tego klienta => każdy w każdej przeglądarce może sobie podejrzeć kod strony gdzie będzie jak wół zapisana twoja tablica z twoimi loginami i hasłami. Jeżeli to nie twój pomysł polecam wytłumaczyć to temu którego to jest pomysł ;)

Pozdrawiam

0

Taa, wiem że to nie jest bezpieczne rozwiązanie, aleeee...
nauczycielowi tego nie wytłumaczę.
Taka treść zadania i koniec heh :)

2

Możesz porozmawiać z nauczycielem o tym, że to rozwiązanie -- trzymanie haseł w tablicy w pliku .JS -- jest nie tylko skrajnie niebezpieczne, ale i zupełnie oderwane od rzeczywistości. Tak po prostu nie wolno robić.

Mówię to nawet będąc entuzjastą i w zasadzie profesjonalnym programistą JavaScriptu.

Nie znaczy to wszystko, że ćwiczenie jest głupie i nieadekwatne. Gdy ktoś się uczy, to często pisze niepraktyczne programy. Warto jednak pewne rzeczy zaznaczyć. Np. kwestie bezpieczeństwa. Są one niezmiernie istotne w programowaniu webowym, a tutaj mówimy o elementarnych podstawach bezpieczeństwa. Tak trywialnych, że nikomu na rozsądnym poziomie umiejętności nie powinno wpaść do głowy, by hasła trzymać w tablicy w skrypcie JS. Zadanie może być niezłym ćwiczeniem, bo np. skorzystasz sobie z tablicy obiektów, tak jak to radził @massther:

var credentialsForAllUsers = [
  {
    login: '[email protected]',
    password: 'haslostefana'
  },
  {
    login: '[email protected]',
    password: 'haslozbycha'
  }
]; 

(jakbyś nie wiedział: credentials to z angielskiego "dane uwierzytelniająca", wyraz popularny gdy piszesz kod autoryzacyjny ;) )

Albo z tablicą tablic ("tablicą dwuwymiarową"):

var credentialsForAllUsers = [
  [ '[email protected]', 'haslostefana' ],
  [ '[email protected]', 'haslozbycha' ]
]; 

Powyższy zapis czysto tablicowy jest krótszy, ale korzystający z niego kod będzie mniej czytelny. Będziesz się odnosił do credentialsForAllUser[i][0] oraz do credentialsForAllUsers[i][1] -- nic nie będzie świadczyło o tym, że w indeksie 0 jest login, a w 1 hasło.

Myślę, że ciekawym pomysłem byłoby zastosowanie mapy, czyli tak naprawdę zwykłego obiektu. Zaraz zademonstruję ile Ci to ułatwi. Kluczami w mapie będą loginy, a wartościami -- hasła.

Najpierw musisz wiedzieć, że klucze (nazwy własności) obiektów zapisujemy zwykle bez cudzysłowów czy apostrofów, ale jeśli klucz zawiera jakieś znaki specjalne (np. @, przecinek, kropka...) to wciąż pozostaje ważnym, poprawnym kluczem -- tyle że musimy otoczyć go cudzysłowami/apostrofami.

Więc obiekt z prostymi kluczami możesz zapisać na dwa sposoby:

// "normalnie", tj. bez apostrofów wokół kluczy:
var obiekt = {
  wlasnoscA: 'Wartość A',
  wlasnoscB: 'Wartość B'
};

// to samo co powyżej, tylko że z apostrofami:
var obiekt = {
  'wlasnoscA': 'Wartość A',
  'wlasnoscB': 'Wartość B'
};

Natomiast jeśli w kluczach masz dziwne znaki, to musisz użyć cudzysłowów/apostrofów:

var obiektZDziwnymiKluczami = {
  'ąę!!#$#@# dziwny klucz A': 'Wartość dziwnego klucza A',
  'Dziwny klucz B': 'Wartość dziwnego klucza B
};

Dzięki temu, że apostrofy pozwalają na to, by kluczami obiektów były dowolne ciągi, możemy wykorzystać klucze do zapisywania dowolnych haseł, o tak:

var credentialsMap  = {
  '[email protected]': 'haslostefana',
  '[email protected]': 'haslozbycha'
};

I teraz zobacz jak ultra-łatwo sprawdzić, czy "w bazie" (mapie) mamy użytkownika o loginie suppliedLogin i czy hasło tego użytkownika odpowiada wartości zmiennej suppliedPassword (zakładamy, że suppliedLogin oraz suppliedPassword to dane wprowadzone przez użytkownika, który chce się zalogować):

if (credentialsMap.hasOwnProperty(suppliedLogin)
    && credentialsMap[suppliedLogin] === suppliedPassword) {
  alert('Dane się zgadzają -- zalogowałeś się!');
}

Nie trzeba robić pętli, nie trzeba używać indexOf.

BTW: żeby nie było, że uważam Twojego nauczyciela za ciumoka: z Twojego kodu wnioskuję, że uczy Was dziedziczenia prototypowego i wyrażeń regularnych, w dodatku w tej lepszej składni (za pomocą literałów). I każde deklarować wszystkie zmienne za pomocą var. To bardzo rozsądne rzeczy do nauczenia się i wielu ludzi kodujących z JS je olewa, a szkoda. Jeśli jesteś w szkole średniej, a nie na studiach, to to tym bardziej imponuje. Tym większa szansa, że rozsądny nauczyciel przyzna Ci rację, że warto chociaż krótko wspomnieć uczniom: hej, my się na razie tylko uczymy kodować, a to miał być tylko ciekawy przykład. W rzeczywistości dane logowania sprawdzajcie zawsze po stronie serwera, nigdy po stronie JS.

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