[mysql + php] Problem z funkcja PASSWORD()


(Uzikan) #1

mam taki problem dziwny...

napisalem skrypt logowania który działał na moim kompie (na webservie) natomiast jak wrzuciłem go do neta to już nie bardzo.

Problem leży w używaniu funkcji PASSWORD() w zapytaniu mysql. Bo tak normalnie to pobiera rekordy le gdy używam password() to już nie działa? Miał ktoś podobny problem lub wie dlaczego tak sie dzieje??

Poprostu nie może pobrac wartości przez funkcje password()

Poniżej zamieszczam kod logowania. Prosze pisać tutaj lub na GG: 7318193

<?php

ob_start();


include('gora.php');

echo'

Logowanie'; if(isset($_POST['wyslij'])){ if(empty($_POST['login'])){ $login=false; echo'Podaj swój login. '; echo' '; } else { $login=$_POST['login']; } if(empty($_POST['haslo'])){ $haslo=false; echo'Podaj hasło. '; echo' '; } else { $haslo=$_POST['haslo']; } if($login && $haslo){ require_once('polaczenie.php'); $zapytanie="SELECT login FROM uzytkownicy WHERE login='$login' AND haslo=PASSWORD('$haslo')"; $wynik=mysql_query($zapytanie); $row=mysql_fetch_array($wynik); $ile=mysql_num_rows($wynik); if($ile==1){ //Jeżeli zwróciło dobry rekord zarejestruj wartosc session_name('sesja'); session_start(); $_SESSION['login']=$row['login']; header("Location: http://" . $_SERVER['HTTP_HOST'] . dirname($_SERVER['PHP_SELF']) . "/index.php?" . SID); } else { echo'Podałeś błędny login lub hasło. '; } mysql_close(); } } echo''; include('dol.php'); ob_end_flush(); ?> [/code]


(Airborn) #2

Być może próbujesz uruchomić to na starszej wersji MySQL’a (starszej niż 4.1), w takim razie możesz haszować hasła np za pomocą MD5() albo SHA1()


(Uzikan) #3

niestety to nie to ;/ Z tego co jest napisane to jest MySQL 5.0.32


(Sitemaster) #4

O 4 litery taki skrypt potłuc!

  1. Po cholere ci tyle ifów na początku? To czy dostałeś login i hasło w jednym można zrobić!

Z tych czterech spokojnie można zejść do 2 a nawet jednego tylko ifa.

  1. Nie pomyślałeś o tym żeby przefiltrować otrzymane postem zmienne?

Przecież teraz bez najmniejszego problemu ktoś mógł by ci totalnie całą baze rozwalić!

Filtruj więc zmienne stripslashes,magic_quotes, htmlspecialchars i tym podobnymi, albo regexpem.

  1. hashować lepiej w php a dopiero potem sprawdzać zapytaniem do bazy czy taki login i hash istnieją

(Uzikan) #5

;/ api… nie sadzisz że piszesz troche nie na temat?? Po co mi wypisujesz porady w jaki sposób zoptymalizować skrypt kiedy problem tkwi w czym innym. Co do paragrafu 3… znowu napisałeś co lepiej a nie dlaczego to mi nie działa.


(inż. Piniol) #6
  1. Sprawdź czy zadziała OLD_PASSWORD zamiast PASSWORD

  2. Jeżeli to nie podziała zpróbuj zmienić pole haslo na typ VARCHAR(16)


(Uzikan) #7

pole haslo jest już ustawione na 16 znaków b bo wiem że tak ma być. OLD_PASSWORD() działa! !!


(inż. Piniol) #8

OLD_PASSWORD działa bo na serwerze jest starsza wersja bazy danych niż u Ciebie na kompie.


(Airborn) #9

a nie przypadkiem odwrotnie? lokalnie była starsza wersja i haszowała w sobie znany sposób hasła, zdalnie wersja mysqla jest nowsza, dlatego wymagamy wstecznej kompatybilności poprzez OLD_PASSWORD()


(Uzikan) #10

no ok…powiedzmy że to wina wersji mysql-a. Ale dlaczego nie działa haszowanie prze md5 i sha1?? Przecież to funkcje PHP. Tzn. one działają tylko że znowu gdy zhaszuje hasło i próbuje je porównać z wpisem w basie danych to nie działa ;/ (oczywiście przy rejestracji usera używam tej samej metody haszowania)

EDIT: jednak na kompie mam starszą wersje mysql