Wysypane logowanie

Wysypane logowanie
4M
  • Rejestracja:około 6 lat
  • Ostatnio:około 2 lata
  • Postów:28
0

Witam, mam dosyc spory problem z logowaniem. Tworze sobie mały projekt. Mam baze danych, rejestracje i index.php na którym jest logowanie. Logowanie jest przez formularz w index.php wysylany POSTem do login.php a nastepnie tam decyduje czy cofa do indexu z błędem czy rusza dalej do zalogowany.php. Po wprowadzeniu błędnych danych wyrzuca błędy, ale po wprowadzeniu poprawnych nie dzieje sie nic, dalej zostaje na indexie, nie zwraca błędów ani nie przenosi dalej.
Tyle czasu się z tym wczoraj męczyłem i nie doszedłem do niczego, dlatego zadaje to pytanie. Gdzie popełniam błąd? Baza to mysql. Hasło do konta wprowadzam na zasadzie przejścia do rejestracji i zhashowane hasło wklejam do tablicy uzytkownicy. Sprawdziłem wszystkie możliwości, nie wiem co jest nie tak. Wielkość liter przy bazie danych jest zachowana odpowiednio.
Jak wprowadzam odpowiedni nick to zwraca drugi błąd, a jak nie ma nicku w bazie to pierwszy - połączenie z bazą i $result->fetch_assoc() raczej jest okej, problem jest przy verify password - tak według mnie, ale jak go ugryźć nie mam pojęcia.

INDEX.PHP

Kopiuj
<?php

	session_start();
	
	if ((isset($_SESSION['zalogowany'])) && ($_SESSION['zalogowany']==true))
	{
		header('Location: zalogowany.php');
		exit();
	}

?>
<!DOCTYPE html>

<html>
    <head>
        <meta charset="UTF-8">
        <title>Formularz rejestracji</title>
                   
    </head>
    <body>
               
        <div id=tytul>Logowanie i rejestracja<br/><br/></div>
        
        <a href="rejestracja.php">Rejestracja - załóż konto</a>
        <br/> <br/>
        
        <form action="login.php" method="POST">
            Login:<br/> <input type="text" name="login"/> <br/>
            Hasło:<br/> <input type="password" name="haslo"/> <br/> <br/>
            <input type="submit" value="Zaloguj"/>

        </form>
        
<?php
if(isset($_SESSION['blad']))	echo $_SESSION['blad'];
?>
        
    </body>
</html>

LOGIN.PHP

Kopiuj
<?php

	session_start();
	
	if ((!isset($_POST['login'])) || (!isset($_POST['haslo'])))
	{
		header('Location: index.php');
		exit();
	}
        
require_once "database.php";

$conn = new mysqli($host, $user, $password, $db_name);

if ($conn->connect_errno!=0)
{
echo "Error: ".$conn->connect_errno;
}

else
{
$login = $_POST['login'];
$haslo = $_POST['haslo'];

$login = htmlentities($login, ENT_QUOTES, "UTF-8");

if ($result = $conn->query(
    sprintf("SELECT * FROM uzytkownicy WHERE NICK='%s'",
    mysqli_real_escape_string($conn, $login))))
{
    $ilu_userow = $result->num_rows;
    if ($ilu_userow>0)
    {
        $wiersz = $result->fetch_assoc();
        if (password_verify($haslo, $wiersz['HASLO']))
        {                
            $_SESSION['zalogowany'] = true;


            unset($_SESSION['blad']);
            $result->close();
            header('Location: zalogowany.php');
        }
        else {      
        $_SESSION['blad'] = '<p>Nieprawidłowy login albo haslo</p>';
        header('Location: index.php');
    }    
    
        }
    else {      
        $_SESSION['blad'] = '<p>Nieprawidłowy login albo haslo, wariant 2</p>';
        header('Location: index.php');
    }
    }
$conn->close();
}
?>

edytowany 1x, ostatnio: 4michal
czysteskarpety
czysteskarpety
  • Rejestracja:prawie 10 lat
  • Ostatnio:ponad 4 lata
  • Lokalizacja:Piwnica
  • Postów:7697
0

Ja swego czasu wrzucałem paczkę z logowaniem w php tu na forum, tylko nie pamiętam w którym temacie, a nie chce mi się szukać :)


L7
  • Rejestracja:ponad 13 lat
  • Ostatnio:około 5 godzin
  • Postów:433
0

@4michal: skoro uważasz, że problem leży w password_verify to może źle jest to hasło zapisywane? Pokaż plik rejestracji.

4M
  • Rejestracja:około 6 lat
  • Ostatnio:około 2 lata
  • Postów:28
0

Wszystko się rozchodzi właśnie o ten kod.. bo podobne paczki znalazłem, poedytowałem pod siebie i nowe rozwiązanie śmiga jak szalone.
Boli mnie, że nie mogę sobie z tym poradzić i męczy mnie to straszliwie,bo już dużo za dużo czasu na to straciłem a dalej jestem w punkcie zero.
Odpalenie drugiego projektu od strzała 10 razy szybciej niż tego nie dało takiej satysfakcji jakbym to naprawił :)

czysteskarpety
czysteskarpety
  • Rejestracja:prawie 10 lat
  • Ostatnio:ponad 4 lata
  • Lokalizacja:Piwnica
  • Postów:7697
1

Wyszukaj sobie przykłady gdzie masz walidacje danych od frontu i backendu, hashowanie hasła minimum sha256 i wyżej itp. to co masz jest mocno "robocze" ;)


4M
  • Rejestracja:około 6 lat
  • Ostatnio:około 2 lata
  • Postów:28
0
leonpro778 napisał(a):

@4michal: skoro uważasz, że problem leży w password_verify to może źle jest to hasło zapisywane? Pokaż plik rejestracji.

rejestracja jeszcze nie wrzuca nic do bazy, wpisuje hasło a potem zwraca mi hash hasła, które umieszczam w bazie.
Na tej podstawie zrobiłem logowanie, które nie działa..
Testowałem takie rozwiązanie na działających projektach i tam działa <zły>

Kopiuj
Haslo: <input type="password" name='pass'><br/><br/>
             <?php 
            if (isset($_SESSION['e_pass'])){
              echo '<div class="error">' .$_SESSION['e_pass'].' </div>';
              unset($_SESSION['e_pass']);
            }
            ?>
.
.
.

$pass_hash = password_hash($pass, PASSWORD_DEFAULT);

    // generowanie hasla
    echo $pass_hash; exit();
L7
  • Rejestracja:ponad 13 lat
  • Ostatnio:około 5 godzin
  • Postów:433
2

Moim zdaniem problem leży w zapisywaniu haseł do bazy. Ponieważ robisz to poprzez kopiuj + wklej (raczej nie będzie się Tobie chciało przepisywać znak po znaku hasowanego hasła) to tylko tutaj może być problem. Zrób sobie skrypt na sprawdzenie:

Kopiuj
<?php
   $pass = 'password'; // tutaj wstaw hasło jakim próbujesz się zalogować
   $hash = 'blablabla'; // tutaj SKOPIUJ hasło z bazy danych w postaci hash
   if (password_verify($pass, $hash)) { echo 'OK'; }
?>

i zobacz czy pójdzie

4M
  • Rejestracja:około 6 lat
  • Ostatnio:około 2 lata
  • Postów:28
0
leonpro778 napisał(a):

Moim zdaniem problem leży w zapisywaniu haseł do bazy. Ponieważ robisz to poprzez kopiuj + wklej (raczej nie będzie się Tobie chciało przepisywać znak po znaku hasowanego hasła) to tylko tutaj może być problem. Zrób sobie skrypt na sprawdzenie:

Kopiuj
<?php
   $pass = 'password'; // tutaj wstaw hasło jakim próbujesz się zalogować
   $hash = 'blablabla'; // tutaj SKOPIUJ hasło z bazy danych w postaci hash
   if (password_verify($pass, $hash)) { echo 'OK'; }
?>

i zobacz czy pójdzie

dzięki za podpowiedź. zrobiłem i.. działa, zwróciło OK.
przeciez to jest w takim razie nie możliwe

L7
  • Rejestracja:ponad 13 lat
  • Ostatnio:około 5 godzin
  • Postów:433
0

No, to teraz do $hash spróbuj wczytać hasło z bazy danych a login wpisz z "palca" :-)

P.s. Możesz pokazać bazę danych z rekordem tego użytkownika?

edytowany 1x, ostatnio: leonpro778
MA
  • Rejestracja:ponad 6 lat
  • Ostatnio:około 5 lat
  • Postów:63
1

Prawdooidobnie w tabeli jest ustawione zbyt maly/za krótki VARCHAR. Ustaw na chocby 100 i sprawdz. Usun te tabele i ustaw na nowo. Jesli pole na haslo jest za krótkie a hash jest dluzszy to ucina haslo i osadza maksymalna dlugosc tego pola. Zamiast "statatata" bedzie "sratat"

edytowany 1x, ostatnio: marchewa
L7
  • Rejestracja:ponad 13 lat
  • Ostatnio:około 5 godzin
  • Postów:433
1

No ale jeżeli skopiował tego hasha z bazy danych i wkleił do tego skryptu sprawdzającego to znaczy, że hasło jest tam dobre :)

MA
  • Rejestracja:ponad 6 lat
  • Ostatnio:około 5 lat
  • Postów:63
1

Jeski tak zrobil jak piszesz to ok. Mam nadzieje ze nie wygenerowal tylko hasla ale skopiowal z bazy.W takim razie niech pokaze zrzut ekranu phpmyadmin tej tabeli. Tam wyciaga rekord hasla ale to pole jest z duzych liter. Moze to pomylka. Mlze ma z malych. Tylko domysly.

Autorze. Wez pousuwaj tam w tym warunku te sesje i przekierowania i daj exit('ok') i exit('blad');
Sprawdz tez dlugosc stringa po hshowaniu i wyciagnieciu z bazy.

Kopiuj
echo strlen($hash_przed_zapisem);
echo strlen($hash_z_bazy);
edytowany 2x, ostatnio: cerrato
4M
  • Rejestracja:około 6 lat
  • Ostatnio:około 2 lata
  • Postów:28
0

baz już robiłem z 10. popołudniu sprawdzę czy jak dam varchara na np 255 przy haśle to coś zmieni, nie pamiętam jakie wartości tam ustawiałem.
Może błąd jest już po wykonaniu ifa z pass verify? Może ja słabo widzę? Bo po wpisaniu błędnego hasła czy loginu dobrze wyrzuca błedy, a po odpowiednim po prostu nie przerzuca na kolejną stronę.
Wszystkie takie trywialne błędy wyeliminowałem, wielkość liter w bazie i kodzie się zgadza 1:1.
Zastosuje się do tego varchara, zrobie najwyżej jeszcze jedną bazę i wrzuce wszystko co mam.

MA
  • Rejestracja:ponad 6 lat
  • Ostatnio:około 5 lat
  • Postów:63
0

To co sie dzieje jak wpiszesz prawodlowe haslo i login

4M
  • Rejestracja:około 6 lat
  • Ostatnio:około 2 lata
  • Postów:28
0
marchewa napisał(a):

To co sie dzieje jak wpiszesz prawodlowe haslo i login

No właśnie nic. Wpisuje prawidłowe i po submicie wraca na index z pustymi polami, nic więcej. Czyta baze, sprawdza hasło (Bo przecież inaczej odpowiednio zwraca dwa różne błędy).

L7
  • Rejestracja:ponad 13 lat
  • Ostatnio:około 5 godzin
  • Postów:433
0

A co masz w pliku zalogowany.php ???

MA
  • Rejestracja:ponad 6 lat
  • Ostatnio:około 5 lat
  • Postów:63
0
Kopiuj
print_r($_SESSION);
4M
  • Rejestracja:około 6 lat
  • Ostatnio:około 2 lata
  • Postów:28
0
leonpro778 napisał(a):

A co masz w pliku zalogowany.php ???

Jest isset czy zalogowany = true A wynikiem jest jakieś echo ok i opcja logout.
Ale próbowałem komentować ten isset i zostawiać samo echo ok i nic to nie dawało.

MA
na sam poczatek usun sesje bo masz pewnie tam namieszane. Potem odpal ten plik logowania i sprawdz tablice sesyjną
4M
  • Rejestracja:około 6 lat
  • Ostatnio:około 2 lata
  • Postów:28
0

Zmienione haslo w bazie na varchar 255. Dodany na dole index.php print_r($_SESSION) który przy błędzie zwraca [blad] => opis bledu, a przy dobrym haśle zwraca Array()
Mistrzostwo świata, nie normalne rzeczy.

edit:
zmieniłem na

Kopiuj
$ilu_userow = $result->num_rows;
    if ($ilu_userow>0)
    {
        $wiersz = $result->fetch_assoc();
        echo $wiersz;

i w login.php zwraca mi Array
Natomiast po wykomentowaniu $wiersz i dodaniu echo ok - działa.
Próbowałem też echo $ilu_userów i zwraca poprawnie 1 (przy dobrym loginie i haśle)

edytowany 1x, ostatnio: 4michal
4M
  • Rejestracja:około 6 lat
  • Ostatnio:około 2 lata
  • Postów:28
2

Jednak przerwy na przemyślenia najprostszych rozwiązań działają. Przepisałem sobie na spokojnie całość i winowajcą było zamknięcie elsa w nieodpowiednim miejscu.
Wydaje mi się, że tytuł króla festiwalu żenady jest mój.
Dzięki serdeczne za pomoc :)

czysteskarpety
czysteskarpety
  • Rejestracja:prawie 10 lat
  • Ostatnio:ponad 4 lata
  • Lokalizacja:Piwnica
  • Postów:7697
0

Bywa, bywa, najlepiej ogarnij jakieś IDE to będzie ci pokazywać błędy ;)


MA
  • Rejestracja:ponad 6 lat
  • Ostatnio:około 5 lat
  • Postów:63
0

A mialem dopisac wczoraj zebys wlaczyl raportowanie błędów

Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)