2009-07-26 15 views

Odpowiedz

23

Jeśli twoja aplikacja przelicza tylko md5, gdy ktoś zarejestruje się w Twojej witrynie lub zaloguje się, masz wiele połączeń do md5 na godzinę? Kilkaset? Jeśli tak, to nie sądzę, żeby różnica między PHP a MySQL była naprawdę mała.

Pytanie powinno bardziej przypominać "gdzie umieścić fakt zapisania hasła za pomocą md5", niż "co sprawia, że ​​wygrywam prawie nic".

I, jako zdarzenie, można postawić inne pytanie: gdzie można pozwolić sobie na wydawanie środków na tego typu obliczenia? Jeśli masz 10 serwerów PHP i jeden serwer DB się już pod dużym obciążeniem, można uzyskać odpowiedź ;-)

Ale tylko dla zabawy:

mysql> select benchmark(1000000, md5('test')); 
+---------------------------------+ 
| benchmark(1000000, md5('test')) | 
+---------------------------------+ 
|        0 | 
+---------------------------------+ 
1 row in set (2.24 sec) 

iw PHP:

$before = microtime(true); 
for ($i=0 ; $i<1000000 ; $i++) { 
    $a = md5('test'); 
} 
$after = microtime(true); 
echo ($after-$before) . "\n"; 

daje:

$ php ~/developpement/tests/temp/temp.php 
3.3341760635376 

Ale prawdopodobnie nie będziecie obliczać miliona md5 w ten sposób, dobrze?

(i to nie ma nic wspólnego z zapobieganiem zastrzyki SQL: po prostu uciec/quote dane zawsze lub użyć sprawozdania przygotowanego!)

+6

Gdy wszystko inne zawiedzie, przeprowadź eksperyment. – Rafe

+2

, więc zaoszczędzisz w przybliżeniu jedną mikrosekundę, wykonując go w bazie danych, zamiast robić to w php. brzmi całkiem nieistotnie, ale ciekawy jest wiedzieć, – Kip

+1

+1 za bardzo dokładną odpowiedź i ważny punkt o zastrzykach SQL :) – Draemon

4

Nie wiem, który jest szybszy, ale jeśli robisz to w PHP, unikasz możliwości wstrzyknięcia SQL.

+1

W każdym razie robię mysql_real_escape_string na moich parach $ pwd. –

+1

To nie ma z tym nic wspólnego. Przygotowane oświadczenie naprawiłoby to bez przenoszenia funkcji MD5, również polegasz na funkcji PHP MD5, aby "uciec" z hasła. – Draemon

+1

@Draemon: Nie powiedziałem, że nie było innych sposobów obejścia tego problemu, ale przykład nie daje żadnego wskazania na ucieczkę z parametru. @hiam: jeśli zdecydujesz się zrobić to w php, nie powinieneś najpierw uciec przed hasłem. Funkcja md5 w php może przyjmować dowolny ciąg znaków i gwarantuje powrót^[0-9a-f] {32} $ – Kip

0

Zmierz, to jedyny sposób, aby się upewnić.

3

Czy wydajność jest tu naprawdę problemem? To może być marginalne.

  • Robi to w MySQL czyni DB zrobić więcej pracy, co jest dobrą rzeczą
  • Robi to w MySQL oznacza czystym tekście hasło zostanie przekazany dalej wzdłuż (a połączenie dB jest często niezaszyfrowanej).
  • To nie ma nic wspólnego z iniekcją SQL. Możesz naprawić pierwszą wersję bez przenoszenia funkcji MD5. Również jeśli wystąpił błąd w funkcji MD5 w PHP, nadal istnieje możliwość ataku iniekcyjnego.
+2

Jaki błąd występuje w md5? Czy spodziewasz się w jakiś sposób go wykorzystać i zamiast 32 cyfr szesnastkowych wypisz jakieś specjalne znaki i dobrze sformatowane wyrażenie sql? Nie wydarzy się. – lacop

+1

To jest właśnie taka postawa, która prowadzi do wyczynów. Nie powinieneś używać arbitralnych funkcji i mam nadzieję, że oczyszczą twoje dane. Co się stanie, jeśli ktoś usunie wymaganie MD5 w pewnym momencie - czy zdadzą sobie sprawę, że dane nie są bezpieczne? – Draemon

+1

To jest po prostu głupie, nie można potem ufać nawet żadnej funkcji ucieczki, ani w ogóle nie dopuścić do jakiejkolwiek funkcji. Nawet sam php lub mysql może być błędny. Dlatego jedynym sposobem na uniknięcie exploitów jest nie wpisywanie żadnego kodu. – lacop

0

Powiedziałbym, odczytać wartość kolumny Spośród mysql, a następnie porównać wynik z obliczonym hashem w kodzie klienta (np. php).

Głównym powodem jest to, że unika się głupich rzeczy, takich jak baza danych zestawiająca kolumnę w sposób niebinarny (na przykład bez uwzględnienia wielkości liter), co jest generalnie niepożądane w przypadku skrótu.