Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Zabezpieczenie strony wieloma jednorazowymi hasłami
Forum PHP.pl > Forum > PHP
Duor
Witam smile.gif
Staram się stworzyć zabezpieczenie strony hasłami jednorazowego użytku, które są zapisane w pliku tekstowym.
Na samej górze strony umieściłem skrypt, który nie pozwala wczytać reszty strony dopóki nie podany poprawnego hasła. Jednak opiera on się na funkcji "stristr", więc jeśli moje hasła zapisane w pliku to przykładowo "haslo123" i "haslo1" to wystarczy przecież wpisać np. "has" i już otrzymamy dostęp, ponieważ ten ciąg znaków również występuje.

Próbowałem także wczytać wszystkie hasła z pliku do tablicy, a następnie sprawdzić funkcją in_array() czy podane przez użytkownika hasło jest poprawne (znajduje się w tablicy), ale funkcja wychwytywała tylko ostatnie hasło z pliku, reszta haseł nie działała.


  1. <?php
  2. $sprawdz = $_SESSION['haslo'];
  3. $hasla = file_get_contents('haslo.txt'); //wczytanie haseł z pliku
  4.  
  5. if(stristr($hasla, $sprawdz) != true){ //jeśli nie podano poprawnego hasła wyświetl formularz wprowadzenia hasła
  6. echo ('
  7. <h2 style="margin-left:15px;">Podaj swój kod dostępu:</h2>
  8. <form method="POST" action="sprawdz.php"> //wprowadzenie hasła przez użytkownika
  9. <input type="password" placeholder="haslo" class="form-control" id="pass" name="haslo" width="300px;" style="margin-left:0px;">
  10. ');
  11. exit(); //wczytaj dalszą część strony, jeśli podano poprawne hasło
  12. }
  13.  
  14. //nadpisanie pliku z hasłami, ale bez zapisywania hasła właśnie użytego (tak, żeby hasła były jednorazowe)
  15. $hasla=str_replace($sprawdz, '', $hasla);
  16. file_put_contents('haslo.txt', $hasla);
  17. ?>


Plik spradz.php:
  1. <?php
  2. $haslo = $_POST["haslo"];
  3. $_SESSION['haslo'] = $haslo;
  4. header("Location: index.php");
  5. ?>


Mam nadzieję, że można rozwiązać mój problem w miarę prosty sposób smile.gif
(Zdaję sobie sprawę, że takie zabezpieczenie nie należy do bardzo bezpiecznych, ale na potrzeby nauki mogę sobie na to pozwolić wink.gif )
Wazniak96
Jak wygląda plik z hasłami? Hasła zapisane po spacji czy w nowych linijkach ?
Duor
W nowych linijkach np.
haslo1234
haslo123
haslotest
Pyton_000
pewnie używałeś do tego celu file(), a ta wczytując linie do tablicy zostawia znak nowej linii na końcu każdej linijki (poza ostatnią jeśli nie było takoweg), więc musisz dodać odpowiedni parametr (patrz manual)
Duor
Mój skrypt oparty na in_array() oraz z wykorzystaniem trim() do usunięcia znaków białych wygląda teraz tak:

  1. $sprawdz = trim($_SESSION['haslo']); //usuwa znaki białe z hasła podanego przez użytkownika
  2. $hasla = file('haslo.txt'); //wczytuje hasła do tablicy
  3. $ileelementow = count ($hasla); //sprawdzam ile haseł zostało wczytanych
  4.  
  5. while ($i <= $ileelementow) { // usuwam białe znaki ze wszystkich haseł w tablicy
  6. $hasla[$i] = trim($hasla[$i]);
  7. $i = $i +1;
  8. }
  9.  
  10. if (in_array($sprawdz, $hasla) == false) { //jeśli nie podano prawidłowego hasła wyświetl formularz
  11. echo ('
  12. <h2 style="margin-left:15px;">Podaj swój kod dostępu:</h2>
  13. <form method="POST" action="sprawdz.php">
  14. <input type="password" placeholder="haslo" class="form-control" id="pass" name="haslo" width="300px;" style="margin-left:0px;">
  15. ');
  16. exit();
  17. }
  18.  
  19.  
  20. // -------------- Przerobiony skrypt usuwania użytego hasła, tym można zająć się później --------------
  21. $ii = 0;
  22. while ($ii <= $ileelementow) {
  23. if (stristr($hasla[$ii], $sprawdz) == true) {
  24. $hasla[$ii] = "";
  25. }
  26. $nowehasla = $nowehasla . $hasla[$ii] . "/n";
  27. $ii = $ii + 1;
  28. }
  29. file_put_contents('haslo.txt', $nowehasla);


Wydaje mi się, że wszystko wygląda całkiem logicznie, jednak teraz strona ładuje się od razu cała, pomijając formularz hasła - tak jakby warunek
  1. if (in_array($sprawdz, $hasla) == false)

nie był spełniony, a przecież domyśnie powinien właśnie być, ponieważ nie podaliśmy jeszcze żadnego hasła...

Będę bardzo wdzięczny za jakiekolwiek wskazówki, im dłużej się z tym męczę tym bardziej zależy mi na znalezieniu sposobu biggrin.gif
kapslokk
  1. while ($i <= $ileelementow) { // usuwam białe znaki ze wszystkich haseł w tablicy
  2. $hasla[$i] = trim($hasla[$i]);
  3. $i = $i +1;
  4. }

Przecież Pyton Ci napisał, żebyś użył odpowiedniej flagi do file(), a Ty kombinujesz.
  1. $hasla = file('haslo.txt', FILE_IGNORE_NEW_LINES); //wczytuje hasła do tablicy


Poza tym jak używasz zmiennej, to warto ją pierw stworzyć. Mam na myśli $i.
Duor
Rzeczywiście wystarczyło poczytać trochę o flagach i wszystko działa, wielkie dzięki za pomoc!

Wklejam gotowy kod, może komuś kiedyś sie przyda wink.gif
  1. $sprawdz = $_SESSION['haslo'];
  2. $hasla = file('haslo.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); // Tego mi było trzeba biggrin.gif
  3. $ileelementow = count ($hasla);
  4.  
  5. if (in_array($sprawdz, $hasla) == false) {
  6. echo ('
  7. <h2 style="margin-left:15px;">Podaj swój kod dostępu:</h2>
  8. <form method="POST" action="sprawdz.php">
  9. <input type="password" placeholder="haslo" class="form-control" id="pass" name="haslo" width="300px;" style="margin-left:0px;">
  10. ');
  11. exit();
  12. }
  13.  
  14. //zapis pozostałych haseł - bez hasła włąśnie użytego
  15. $ii = 0;
  16. while ($ii <= $ileelementow) {
  17. if (stristr($hasla[$ii], $sprawdz) == true) {
  18. $hasla[$ii] = "";
  19. }
  20. $nowehasla = $nowehasla . $hasla[$ii] . "\r\n";
  21. $ii = $ii + 1;
  22. }
  23. file_put_contents('haslo.txt', $nowehasla);
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.