Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Logowanie
Forum PHP.pl > Forum > Przedszkole
MateuszS
Witam. Miałem skrypt bez bazy, jednak po dodaniu bazy danych musiałem go przerobić, słabo mi to wyszło bo coś nie działa za bardzo, cały czas złe hasło, przerabiałem go jak się da, dorabiałem itd i mam

  1. <?php
  2. if($_GET['opcja']=='logowanie') {
  3. $logineczek = $_POST['login'];
  4. $haseleczko = $_POST['haslo'];
  5. $cohaseleczko = sha1($haseleczko);
  6. $inv = mysql_query("SELECT `username`,`sha_pass_hash` FROM `account` WHERE username='$logineczek' AND sha_pass_hash='$cohaseleczko'");
  7. $rowek = mysql_fetch_assoc($inv);
  8.  
  9. if($logineczek == $rowek['username'] and $cohaseleczko == $rowek['sha_pass_hash']) {
  10. $_SESSION['log'] = '1234592';
  11. echo '<script language="JavaScript">window.location="store.php?id=17&opcja=panel";</script>';
  12. } elseif ((!empty($_POST['login']) or !empty($_POST['haslo'])) and ($rowek['username'] != $_POST['login'] or $rowek['sha_pass_hash'] != $cohaseleczko)) {
  13. echo '<center><br /><font color="red">Zły login lub hasło</font></center>'; }
  14.    if($_SESSION['log'] == '1234592') {
  15.    echo '<b><a href="store.php?id=17&opcja=panel">PANEL</a></b>';
  16.    }
  17. echo '<form method="POST">
  18.      <b><center>Zaloguj się na konto serwerowe: </b><br />';
  19. echo '<p>Login: <input type="text" size="15" name="login" /></p>
  20.      <p>Hasło: <input type="password" size="15" name="haslo" /></p>
  21.      <p><input type="submit" value="Zaloguj" name="Zaloguj" />';
  22.  
  23. }
  24. ?>


Nie wiem co jest źle bo nie loguje do bazy...
Spawnm
  1. <?php
  2. if($_GET['opcja']=='logowanie') {
  3. $logineczek = $_POST['login'];
  4. ?>

wysyłasz post , a chcesz odebrać get

//edit,
kod bez sensu tongue.gif
podatny na sql injection
mls
Cytat(Spawnm @ 20.03.2009, 17:49:36 ) *
wysyłasz post , a chcesz odebrać get


A co ma piernik do wiatraka, że tak to ujmę? POST i GET mogą iść jednocześnie i w tym konkretnym przypadku zapewne tak jest.

Moim pytaniem jest więc - czy to cały skrypt, czy jego część? Czy jest w nim w ogóle połączenie się z bazą danych? Jaki konkretnie błąd zwraca skrypt?
MateuszS
Polaczenie z baza jest OK. Mysle ze tu chodzi o hashowanie sha1. Poniewaz gdy je usunę, zmienie w bazie to i owo zeby nie bylo hasla hashowanego wszystko dziala ale po dodaniu hasha wszystko sie wali. Tabela ma nazwe sha_pass_hash jak zauwazyliscie (ja jej nie tworzylem) wiec chyba sha1 jest kodowanie. Teraz wywala caly czas ze zle haslo lub login

Tak to czesc wiekszego skryptu (jego poczatek)

PS prosze tez o rady jak go od SQL INj ochronic
Fifi209
To pokaż nam przykładowy rekord z tabeli z hashami... jej nazwa nie musi mieć nic do zawartości.
Przy zapisywaniu i tak trzeba zapisać jako hash.

@edit
Co do zabezpieczeń przed SQLi, mysql_real_escape_string" title="Zobacz w manualu PHP" target="_manual, addslashes" title="Zobacz w manualu PHP" target="_manual
MateuszS
  1. -- phpMyAdmin SQL Dump
  2. -- version 3.1.3
  3. --
  4. -- Host: localhost
  5. -- Czas wygenerowania: 20 Mar 2009, 18:04
  6. -- Wersja serwera: 5.0.67
  7. -- Wersja PHP: 5.2.6
  8.  
  9. SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
  10.  
  11.  
  12. /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
  13. /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
  14. /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
  15. /*!40101 SET NAMES utf8 */;
  16.  
  17. --
  18. -- Baza danych: `realmd`
  19. --
  20.  
  21. -- --------------------------------------------------------
  22.  
  23. --
  24. -- Struktura tabeli dla `account`
  25. --
  26.  
  27. CREATE TABLE IF NOT EXISTS `account` (
  28. `id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'Identifier',
  29. `username` varchar(32) NOT NULL DEFAULT '',
  30. `sha_pass_hash` varchar(40) NOT NULL DEFAULT '',
  31. `gmlevel` tinyint(3) UNSIGNED NOT NULL DEFAULT '0',
  32. `sessionkey` longtext,
  33. `v` longtext,
  34. `s` longtext,
  35. `email` varchar(320) NOT NULL DEFAULT '',
  36. `joindate` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  37. `last_ip` varchar(30) NOT NULL DEFAULT '127.0.0.1',
  38. `failed_logins` int(11) UNSIGNED NOT NULL DEFAULT '0',
  39. `locked` tinyint(3) UNSIGNED NOT NULL DEFAULT '0',
  40. `last_login` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  41. `online` tinyint(4) NOT NULL DEFAULT '0',
  42. `expansion` tinyint(3) UNSIGNED NOT NULL DEFAULT '0',
  43. `mutetime` bigint(40) UNSIGNED NOT NULL DEFAULT '0',
  44. `locale` tinyint(3) UNSIGNED NOT NULL DEFAULT '0',
  45. PRIMARY KEY (`id`),
  46. UNIQUE KEY `idx_username` (`username`),
  47. KEY `idx_gmlevel` (`gmlevel`)
  48. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='Account System' AUTO_INCREMENT=5 ;
  49.  
  50. --
  51. -- Zrzut danych tabeli `account`
  52. --
  53.  
  54. INSERT INTO `account` (`id`, `username`, `sha_pass_hash`, `gmlevel`, `sessionkey`, `v`, `s`, `email`, `joindate`, `last_ip`, `failed_logins`, `locked`, `last_login`, `online`, `expansion`, `mutetime`, `locale`) VALUES
  55. (1, 'ADMINISTRATOR', 'a34b29541b87b7e4823683ce6c7bf6ae68beaaac', 3, '', '0', '0', '', '2006-04-25 12:18:56', '127.0.0.1', 0, 0, '0000-00-00 00:00:00', 0, 0, 0, 0),
  56. (2, 'GAMEMASTER', '7841e21831d7c6bc0b57fbe7151eb82bd65ea1f9', 2, '', '0', '0', '', '2006-04-25 12:18:56', '127.0.0.1', 0, 0, '0000-00-00 00:00:00', 0, 0, 0, 0),
  57. (3, 'MODERATOR', 'a7f5fbff0b4eec2d6b6e78e38e8312e64d700008', 1, '', '0', '0', '', '2006-04-25 12:19:35', '127.0.0.1', 0, 0, '0000-00-00 00:00:00', 0, 0, 0, 0),
  58. (4, 'player', 'player', 0, '', '0', '0', '', '2006-04-25 12:19:35', '127.0.0.1', 0, 0, '0000-00-00 00:00:00', 0, 0, 0, 0);
artur_dziocha
wyświtl sobie tablice $_POST, zahashowane hasło, może błędy w zapytaniu
  1. <?php
  2. $query = mysql_query($sql) or die(mysql_error());
  3. ?>
MateuszS
nie tego wina sad.gif cos z kodowaniem... albo skladnia nie wiem
artur_dziocha
ale wyświetliłeś i porównałeś z baza??jakieś błędy wyskakująquestionmark.gif
thomson89
Może sie mylę mozę źle radzę.

Myślę ze kodujesz w inny sposób a hasło do porównania też w inny. Ale mogę się mylić.

Też kiedyś miałem logowanie jednego użytkownika, potem przeniosłem to na bazę, a potem dałem hashowanie i dluuuugo mi nie działało.

Kod
za pomocą echo sha1('tajnehaslo'); brałem shasowaną wersję hasła
dalej ręcznie kopiowałem to do bazy, update
i wpisywałem tajnehaslo w formularz


Miałem wtedy tylko jeden wiersz w tabeli, takze w koncu doszedłem co tam było. No, ale teraz nie pamiętam.
MateuszS
To moze ktos pozmienia ten skrypt, bo dosc chaotyczny jest
erix
To może przepiszesz go zgodnie ze wskazówkami? Na ogłoszenia/zlecenia jest odpowiedni dział.
thomson89
Ja bym to zrobił inaczej.
  • Sprawdzamy wypełnienie formularza
  • Łączymy się z bazą
  • Ustawiamy krótkie zmienne
  • Hashujemy hasło sha1
  • Sprawdzamy czy jest taki uzytkownik:
    1. SELECT * FROM userzy WHERE nazwa=login AND haslo=cohaslo
  • Wynik przepuszczamy przez num rows
  • Jeżeli wynik<1 & wynik>2 błąd
  • Jeżeli wynik = 1 mozemy zalogować uzytkownika

Wczesniej zrób to co napisałe post wczesniej i pórbuj aż ci wyjdzie.


Cytat(MateuszScirka @ 20.03.2009, 22:09:24 ) *
To moze ktos pozmienia ten skrypt, bo dosc chaotyczny jest


Dlatego twórcy php, i nie tylko umożliwili dodawanie komentarzy, wcięć enterów, odstępów, tab, spacji itp. itd.

  1. <?php
  2. //*****************//
  3. // WAZNACZYNNOSC //
  4. //*****************//
  5.  
  6.                                                         //jakies objasnienie
  7.  
  8. //teraz robie to
  9.  
  10. /a tutaj zmieniam to na to
  11. ?>
MateuszS
Napisałem własne

  1. <?php
  2. if($_GET['opcja']=='logowanie') {
  3. $user = mysql_real_escape_string($_POST['login']);
  4. $pass = mysql_real_escape_string(sha1($_POST['password']));
  5. $query=mysql_query("SELECT id,username,sha_pass_hash FROM `account`
  6.                    WHERE username='$user' AND sha_pass_hash='$pass' ");
  7.    if($query) {
  8.    $_SESSION['log'] = '1234592';
  9.    header("Location: store.php?id=17&opcja=panel");
  10.    } else {
  11.    echo 'Złe dane.';
  12.    }
  13.                    
  14.    
  15.  
  16.  
  17. }
  18. ?>


Jednak zawsze mnie przenosi do panelu ^^
Fifi209
Gdyż w zmiennej $query zawsze coś jest;d

Daj tam zamiast $query
$dane = mysql_fetch_assoc($query)
MateuszS
To znowu ja. Wiem na czym polega problem. Otóż: hasło które koduję i porównuję nie jest identyczne z tym które mam w bazie. Oto kod:

  1. <?php
  2. $login = $_POST['login'];
  3. $haslo = sha1($_POST['password']);
  4.  
  5. $query = mysql_query("SELECT * FROM `account`") or die(mysql_error());
  6. $wynik = mysql_fetch_assoc($query);
  7.  
  8. if($login == $wynik['username'] && $haslo == $wynik['sha_pass_hash']) {
  9. echo 'Zalogowany';
  10. } else {
  11. echo 'Nie zalogowany';
  12. echo '<br /><br />';
  13. echo $wynik['username'] . '<br />' . $login . '<br />' . $wynik['sha_pass_hash'] . '<br />' . $haslo;
  14. }
  15. ?>


Login: ADMINISTRATOR hasło: administrator
Oto moje porównanie:
Kod
Nie zalogowany

ADMINISTRATOR
ADMINISTRATOR
a34b29541b87b7e4823683ce6c7bf6ae68beaaac
b3aca92c793ee0e9b1a9b0a5f5fc044e05140df3



JAk to naprawić?
decha-design
jakim cudem hash sha1 z ADMINISTRATOR jest a34b29541b87b7e4823683ce6c7bf6ae68beaaac jak ja mam 25c5d184fd3c8e7d24af0e237c061f5480a5e86e ... o.O'

Ja nie wiem co ty tam robisz ...
MateuszS
napisałem przecież że hash z administrator a nie ADMINISTRATOR
thomson89
Cytat(thomson89 @ 20.03.2009, 19:51:47 ) *
Myślę ze kodujesz w inny sposób a hasło do porównania też w inny. Ale mogę się mylić.

Cytat(MateuszScirka @ 5.04.2009, 11:43:45 ) *
To znowu ja. Wiem na czym polega problem. Otóż: hasło które koduję i porównuję nie jest identyczne z tym które mam w bazie. Oto kod:


A nie mówiłem?
MateuszS
Więc nie wiem czemu to się nie zgadza a powinno
Merko
Co do tego skryptu z logowaniem :



Kod
Nie zalogowany

ADMINISTRATOR
ADMINISTRATOR
a34b29541b87b7e4823683ce6c7bf6ae68beaaac - ADMINISTRATOR:ADMINISTRATOR
b3aca92c793ee0e9b1a9b0a5f5fc044e05140df3 - administrator

Wystarczy uzyć dekodera jest ich pełno i powinieneś już wiedzieć czemu nie działa tongue.gif
MateuszS
No ok ale czemu tak sie dzieje? Czemu sie 2 razy administrator pojawia i dwukropek, w kodzie nic takiego nie ma
Merko
W bazie masz tak zapisane pewno przy rejestracji albo cos...
MateuszS
Na 100% login ADMINISTRATOR i haslo administrator ma byc
thomson89
Trzy kroki:
  • tworzysz plik koduj php:
    1. <?php
    2. if(!isset($_GET['a'])){
    3. echo '<form method="post" action="koduj.php?a=a"><input type="text" name="ciag"></form>';
    4. }
    5. if(isset($_GET['a'])){
    6. $ciag = $_POST['ciag'];
    7. echo 'Ciąg to:'.$ciag;
    8. echo '<br>Ciąg sha1() to:'.sha1($ciag);
    9. ?>
  • podany ciąg zapisujesz od bazy za pomocą
    1. UPDATE uzytkownicy WHERE id=1 SET haslo='twojciag z powyzszego skryptu'
  • włączasz swoje logowanie

Powinno śmigać.

Pozdro!
MateuszS
dzieki, ale slabo ten skrypt rozumiem
Merko
Może z bazy masz zle skodowane przecież widzisz w sha1 zobacz jakie w bazie jest i się wyjasni. Zapewne zle dodałeś rekord i przez to błąd
MateuszS
rekord juz byl dodany, baza jest pobrana
thomson89
Cytat(MateuszScirka @ 5.04.2009, 19:48:43 ) *
dzieki, ale slabo ten skrypt rozumiem


Mój skrypt?

No, oj, sorry. Dodaj <input type="submit" value="koduj">. Czyli będzię: echo '<form method="post" action="koduj.php?a=a"><input type="text" name="ciag"><input type="submit" value="koduj"></form>';

Do kodu podajesz ciag do zakodowania. Jak klikniesz koduj, to przejdziemy do koduj.php?a=a i zostanie spełniony drugi warunek. Wtedy wyświetlimy ciag i zakodowany ciag.
Merko
Ale zaraz sie zdenerwuje haha.gif Mówie Tobie że logowanie jest ok tylko w bazie hasło masz złe!

w bazie masz to a34b29541b87b7e4823683ce6c7bf6ae68beaaac - to nie jest sha1("administrator") tylko sha1("ADMINISTRATOR:ADMINISTRATOR")

Jak juz zdążyłem zauważyć na innych kontach tez jest zle np Moderator a7f5fbff0b4eec2d6b6e78e38e8312e64d700008 - MODERATOR:MODERATOR widać że login tu jest 



Spróbuj zalogowac sie na hasło ADMINISTRATOR:ADMINISTRATOR to na 90% wejdziesz

Pozdrawiam
MateuszS
No ta ale do gry ktorej ta baza dotyczy loguje sie administrator administrator. NIe powiem graczom zeby wpisywali 2x razy hasla prawda? Pozdro
kantek
Cytat(MateuszScirka @ 6.04.2009, 15:55:18 ) *
No ta ale do gry ktorej ta baza dotyczy loguje sie administrator administrator. NIe powiem graczom zeby wpisywali 2x razy hasla prawda? Pozdro


np. dla ADMINISTRATOR:ADMINISTRATOR
(nazwy zmiennych wstaw sobie swoje smile.gif )
  1. <?php
  2. $haslo = $_POST['haslo'].':'.$_POST['haslo'];
  3. ?>


Ale takie rozwiązanie to prowizorka lepiej poświęć trochę czasu i zrób sobie logowanie porządnie
w końcu to kwestia bespieczeństwa.

Pozdrawiam
MateuszS
Nom zrobie tak tymczasowo. Ale musze rozwiazac problem czemu tak sie dzieje.
thomson89
Cytat(MateuszScirka @ 6.04.2009, 16:54:12 ) *
Ale musze rozwiazac problem czemu tak sie dzieje.


Odpowiedź:

Cytat(thomson89 @ 20.03.2009, 19:51:47 ) *
Myślę ze kodujesz w inny sposób a hasło do porównania też w inny.

Cytat(MateuszScirka @ 5.04.2009, 20:23:16 ) *
rekord juz byl dodany, baza jest pobrana
Merko
Powiam inaczej bo tak to nie łapiesz jak wrzucałeś baze to wrzuciłeś ze złym hasłem na 100% bo to logowanie działa poprawnie to nie jest wina logowania!! To wina tego rekordu, możliwe że na rejstracji masz zwalone. Bo to nie przy logowaniu robi sie ADMINISTRATOR:ADMINISTRATOR tylko w bazie jest zakodowane tak rozumiesz??
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.