Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [MySQL][PHP]Czy taka forma z mysql jest bezpieczna?, bezpieczeństwo zapytań do bazy danych
qpeace1
post
Post #1





Grupa: Zarejestrowani
Postów: 19
Pomógł: 0
Dołączył: 1.06.2008

Ostrzeżenie: (0%)
-----


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. ?>
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 12)
kilas88
post
Post #2





Grupa: Zarejestrowani
Postów: 305
Pomógł: 25
Dołączył: 27.01.2007

Ostrzeżenie: (0%)
-----


Nie, nie jest w 100% bezpieczne.
Go to the top of the page
+Quote Post
Mephistofeles
post
Post #3





Grupa: Zarejestrowani
Postów: 1 182
Pomógł: 115
Dołączył: 4.03.2009
Skąd: Myszków

Ostrzeżenie: (0%)
-----


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ć...
Go to the top of the page
+Quote Post
wookieb
post
Post #4





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




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...


--------------------
Go to the top of the page
+Quote Post
Mephistofeles
post
Post #5





Grupa: Zarejestrowani
Postów: 1 182
Pomógł: 115
Dołączył: 4.03.2009
Skąd: Myszków

Ostrzeżenie: (0%)
-----


Ale czy to nie jest tak, że wtedy silnik bazy wie co jest parametrem a co zapytaniem, i nie trzeba tego zabezpieczać?
Go to the top of the page
+Quote Post
wookieb
post
Post #6





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




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.


--------------------
Go to the top of the page
+Quote Post
Crozin
post
Post #7





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
wookieb
post
Post #8





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




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?


--------------------
Go to the top of the page
+Quote Post
Crozin
post
Post #9





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


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).
Go to the top of the page
+Quote Post
kaźmirz
post
Post #10





Grupa: Zarejestrowani
Postów: 103
Pomógł: 2
Dołączył: 6.07.2010

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
qpeace1
post
Post #11





Grupa: Zarejestrowani
Postów: 19
Pomógł: 0
Dołączył: 1.06.2008

Ostrzeżenie: (0%)
-----


Szanowni Państwo, a wracając do tematu ;-) ?




Co jeszcze jest w kodzie do uszczelnienia ?
sadsmiley02.gif

Ten post edytował qpeace1 22.11.2010, 16:49:05
Go to the top of the page
+Quote Post
kilas88
post
Post #12





Grupa: Zarejestrowani
Postów: 305
Pomógł: 25
Dołączył: 27.01.2007

Ostrzeżenie: (0%)
-----


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?
Go to the top of the page
+Quote Post
qpeace1
post
Post #13





Grupa: Zarejestrowani
Postów: 19
Pomógł: 0
Dołączył: 1.06.2008

Ostrzeżenie: (0%)
-----


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)
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 22.08.2025 - 03:57