Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]Czy taka forma z mysql jest bezpieczna?
Forum PHP.pl > Forum > Przedszkole
qpeace1
Witam, proszę o pomoc, czy takie zapytanie jest bezpieczne z punktu widzenia ataku na moją stronę?:

  1. <?php
  2. include ('polacz_z_baza_danych.inc');
  3. mysql_select_db("nazwa_bazy_danych")or die("Wystąpił błąd podczas wybierania bazy danych");
  4.  
  5. $podpis = mysql_real_escape_string($_POST['podpis']);
  6. $tresc = mysql_real_escape_string($_POST['tresc']);
  7.  
  8. if(empty($tresc))
  9. {
  10. echo '<form enctype="multipart/form-data" action="dodaj_wpis.php" method="post">
  11. <b>Twoje imię:</b> <input name="podpis" type="text" maxlength="80" SIZE="60" value="">
  12. <br>
  13. <p><b>Treść wpisu:</b></p><textarea name="tresc" cols="100" rows="20"></textarea>
  14. <br />
  15. <input type="submit" value="Dodaj">';
  16. echo '</form>';
  17. }
  18. else
  19. {
  20. mysql_query('LOCK TABLES `moja_ksiega_gosci` WRITE');
  21. $zapytanie = sprintf("INSERT INTO moja_ksiega_gosci (`podpis`, `tresc`, `data_wpisu`)
  22. VALUES ('%s', '%s', now())",
  23. $podpis,
  24. $tresc
  25. );
  26.  
  27. //wykonaj zapytanie
  28. mysql_query($zapytanie, $polaczenie_sql);
  29.  
  30. //odblokuj tabelę
  31. mysql_query('UNLOCK TABLES');
  32.  
  33. if (mysql_affected_rows($polaczenie_sql) > 0)
  34. {
  35. echo 'Komunikat został poprawnie dodany';
  36. }
  37. }
  38.  
  39. //zamykam baze danych
  40. mysql_close($polaczenie_sql);
  41. ?>
kilas88
Nie, nie jest w 100% bezpieczne.
Mephistofeles
Mnie ciągle zastanawia dlaczego ludzie stosują przestarzałe mysql_, zamiast używać PDO i zapytań preparowanych, gdzie o SQL Injection można praktycznie zapomnieć...
wookieb
Cytat(Mephistofeles @ 22.11.2010, 11:05:01 ) *
Mnie ciągle zastanawia dlaczego ludzie stosują przestarzałe mysql_, zamiast używać PDO i zapytań preparowanych, gdzie o SQL Injection można praktycznie zapomnieć...

Ale zapytania przygotowywane nie są do zabezpieczania przed SQL Injection...
Mephistofeles
Ale czy to nie jest tak, że wtedy silnik bazy wie co jest parametrem a co zapytaniem, i nie trzeba tego zabezpieczać?
wookieb
Zapytania przygotowywane rzeczywiście przed tym zabezpieczają ale nie służą do tego. Służą do wykonywania zapytań w pętli, przez co np nie muszą wielokrotnie parsować całego zapytania.
Crozin
PreparedStatements mają to do siebie, że do bazy zapytanie i jego parametry lecą osobno. PDO nie "scala" tego na zasadzie:
  1. replace(':paramName', mysql_real_e...($paramName))
Mimo wszystko takie zapytania użyte niepoprawnie nadal mogą być podatne na tak trywialne ataki jak SQLInjection.
wookieb
Cytat(Crozin @ 22.11.2010, 15:08:35 ) *
takie zapytania użyte niepoprawnie nadal mogą być podatne na tak trywialne ataki jak SQLInjection.

Przykład?
Crozin
W sumie to powinienem cofnąć to zdanie. Miałem na myśli coś w stylu:
  1. WHERE col_name = :abcParam OR col_name = '$variable'
Ale w takim przypadku raczej ciężko mówić o Prepared Statement (jakoś tak "przygotowane wyrażenie" czy inne polskie tłumaczenia mi nie pasują biggrin.gif).
kaźmirz
Cytat(Mephistofeles @ 22.11.2010, 14:42:59 ) *
Ale czy to nie jest tak, że wtedy silnik bazy wie co jest parametrem a co zapytaniem, i nie trzeba tego zabezpieczać?

Czyli uzywajac PDO nie musimy juz zabezpieczac danych w zmiennych, przekazywanych do zapytania (bazy) i otrzymywanych z bazy?
Jesli tak, to trzeba chyba sie przerzucic na to PDO winksmiley.jpg
qpeace1
Szanowni Państwo, a wracając do tematu ;-) ?




Co jeszcze jest w kodzie do uszczelnienia ?
sadsmiley02.gif
kilas88
Cytat(qpeace1 @ 22.11.2010, 16:47:43 ) *
Szanowni Państwo, a wracając do tematu ;-) ?

Co jeszcze jest w kodzie do uszczelnienia ?
sadsmiley02.gif

jak już zostało napisane, podany kod nigdy nie będzie wystarczająco bezpieczny - aby rozwiązać ten problem zastosuj PDO i prepared staitments.

nawiasem mówiąc, nie rozumiem tego fragmentu kodu:

  1. mysql_query('LOCK TABLES `moja_ksiega_gosci` WRITE');
  2. $zapytanie = sprintf("INSERT INTO moja_ksiega_gosci (`podpis`, `tresc`, `data_wpisu`)
  3. VALUES ('%s', '%s', now())",
  4. $podpis,
  5. $tresc
  6. );
  7.  
  8. //wykonaj zapytanie
  9. mysql_query($zapytanie, $polaczenie_sql);
  10.  
  11. //odblokuj tabelę
  12. mysql_query('UNLOCK TABLES');


dlaczego blokujesz tabelę na czas wstawiania JEDNEGO rekordu? rozumiem, gdybyś wstawiał kilka integralnie połączonych ze sobą rekordów (czy aktualizował/usuwał), ale w tej sytuacji?
qpeace1
Cytat(kilas88 @ 22.11.2010, 16:53:50 ) *
dlaczego blokujesz tabelę na czas wstawiania JEDNEGO rekordu? rozumiem, gdybyś wstawiał kilka integralnie połączonych ze sobą rekordów (czy aktualizował/usuwał), ale w tej sytuacji?


Jestem beginer i boję się, że MySQL może nie mieć wbudowanej ochrony wstawiania nowego rekordu, co przy jednoczesnym (mało, ale prawdopodobnej sytuacji) wstawianiu rekordu przez 2 osoby może teoretycznie wysypać całą bazę {chyba, bo jak wspomniałem nie mam pewności}.

Nie bardzo rozumiem - dlaczego to nie ochrania przez Injection-em, przecież w POST nic nie da się tu przemyciś {taką miałem nadzieję}, mógłbyś rozwinąć myśl? (tj. jak można tu dostać się niepowołanie do bazy)
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.