Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [MySQL][PHP]PDO czy w 100% bezpieczne
vento
post
Post #1





Grupa: Zarejestrowani
Postów: 21
Pomógł: 0
Dołączył: 17.02.2016

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


Witam. Mam pytanie odnośnie PDO.
Czy w obecnej chwili jest możliwe jakieś wstrzyknięcie SQL przy np. takim kodzie:
  1. <?php
  2. include('connect.php');
  3. $nick = $_POST['nick'];
  4. $komentarz = $_POST['komentarz'];
  5. $db = new PDO('mysql:host='.$server.';dbname='.$db_name.';charset=utf8mb4', ''.$login.'', ''.$password.'');
  6. try
  7. {
  8. $zapytanie = "INSERT INTO `pdo`.`main` (`nick`, `data`, `komentarz`) VALUES ('$nick', NOW(), '$komentarz');";
  9. $db->query($zapytanie);
  10. }
  11. catch(PDOException $ex)
  12. {
  13. echo "error";
  14. }
  15. ?>


Wcześniej korzystałem z mysqli, ale przeczytałem, że PDO jest nowszą technologią, która posiada dodatkowe zabezpieczenia np. przed wstrzykiwaniem SQL.
Tak jak pisałem na początku moje pytanie brzmi czy jest to w 100% bezpieczne?
Go to the top of the page
+Quote Post
kapslokk
post
Post #2





Grupa: Zarejestrowani
Postów: 965
Pomógł: 285
Dołączył: 19.06.2015
Skąd: Warszawa

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


tak, jest możliwe wstrzyknięcie sql. Używaj bindowania. http://php.net/manual/en/pdostatement.bindparam.php

Ten post edytował kapslokk 20.05.2016, 20:40:09
Go to the top of the page
+Quote Post
vento
post
Post #3





Grupa: Zarejestrowani
Postów: 21
Pomógł: 0
Dołączył: 17.02.2016

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


Cytat(kapslokk @ 20.05.2016, 21:39:49 ) *
tak, jest możliwe wstrzyknięcie sql. Używaj bindowania. http://php.net/manual/en/pdostatement.bindparam.php


Rozumiem. Czy jest wtedy sens przeskakiwania na PDO czy można zostać przy mysqli?
Go to the top of the page
+Quote Post
kapslokk
post
Post #4





Grupa: Zarejestrowani
Postów: 965
Pomógł: 285
Dołączył: 19.06.2015
Skąd: Warszawa

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


Jeśli dopiero zaczynasz pisanie aplikacji, to chyba lepiej użyć PDO, w razie potrzeby łatwiej będzie Ci zmienić bazę danych, mysqli jest tylko do mysql'a. Jeżeli musisz przepisywać dużą część aplikacji to już Twoja decyzja tongue.gif
Go to the top of the page
+Quote Post
vento
post
Post #5





Grupa: Zarejestrowani
Postów: 21
Pomógł: 0
Dołączył: 17.02.2016

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


Chodzi mi raczej tylko o bezpieczeństwo.
W mysqli zamieniałem ciąg znaków na base64 a przy wyświetlaniu rekordów na stronie po prostu je odkodowywałem i to było moje zabezpieczenie przed wstrzykiwaniem sql.
Myślałem, że PDO chroni przed jakimkolwiek wstrzyknięciem, ale jeżeli nie to chyba nie ma sensu przechodzić na PDO.
Jeszcze jedno pytanie przeczytałem na jakimś forum, że w PHP 7.0 mysqli oraz mysql mają być usunięte i ma zostać samo PDO czy to prawda?
Go to the top of the page
+Quote Post
kapslokk
post
Post #6





Grupa: Zarejestrowani
Postów: 965
Pomógł: 285
Dołączył: 19.06.2015
Skąd: Warszawa

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


Cytat
Myślałem, że PDO chroni przed jakimkolwiek wstrzyknięciem, ale jeżeli nie to chyba nie ma sensu przechodzić na PDO.

Chroni, pod warunkiem, że używasz bindowania. Mysqli też ma bindowanie: http://php.net/manual/en/mysqli-stmt.bind-param.php

Co do tego base64 to nie wiem jakby to miało w czymkolwiek pomóc.

A co do PHP7 to mysql_ zostało usunięte, ale mysqli nadal jest.
Go to the top of the page
+Quote Post
vento
post
Post #7





Grupa: Zarejestrowani
Postów: 21
Pomógł: 0
Dołączył: 17.02.2016

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


  1. <?php
  2. include('connect.php');
  3. $nick = $_POST['nick'];
  4. $komentarz = $_POST['komentarz'];
  5. $polaczenie = @new mysqli($servername, $username, $password, $dbname);
  6. if ($polaczenie->connect_errno!=0)
  7. {
  8. echo "ERROR TO CONNECT MYSQL";
  9. }
  10. else
  11. {
  12. $nick = base64_encode($nick);
  13. $komentarz = base64_encode($komentarz);
  14. $zapytanie = "INSERT INTO `pdo`.`main` (`nick`, `data`, `komentarz`) VALUES ('$nick', NOW(), '$komentarz');";
  15. $polaczenie->query($zapytanie);
  16. }
  17.  
  18. ?>


Chodzi mi mniej więcej o coś takiego, że wszystkie dane ktore wpisuje user zostają zamienione na base64 (przykład wyżej).
Czy nadal jest możliwe wstrzyknięcie SQL?

Ten post edytował vento 20.05.2016, 21:03:37
Go to the top of the page
+Quote Post
kapslokk
post
Post #8





Grupa: Zarejestrowani
Postów: 965
Pomógł: 285
Dołączył: 19.06.2015
Skąd: Warszawa

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


Hahaha, no nie jest możliwe, ale to nie jest optymalne rozwiązanie biggrin.gif Wszystkie pola w bazie musiał byś mieć tekstowe, a to nie o to w tym wszystkim chodzi. Masz filtrować dane, a nie wrzucać co popadnie, tylko zakodowane w base64 biggrin.gif

Poza tym, już lepiej robić wszedzie: http://php.net/manual/en/mysqli.real-escape-string.php niż base64_encode biggrin.gif pisania mniej-więcej tyle samo, a przynajmniej baze przeglądać możesz normalnie biggrin.gif

Ten post edytował kapslokk 20.05.2016, 21:08:56
Go to the top of the page
+Quote Post
vento
post
Post #9





Grupa: Zarejestrowani
Postów: 21
Pomógł: 0
Dołączył: 17.02.2016

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


Rozumiem. Dziękuje za pomoc.

  1. <?php
  2. include('connect.php');
  3. $nick = $_POST['nick'];
  4. $komentarz = $_POST['komentarz'];
  5. $polaczenie = @new mysqli($servername, $username, $password, $dbname);
  6. if ($polaczenie->connect_errno!=0)
  7. {
  8. echo "ERROR TO CONNECT MYSQL";
  9. }
  10. else
  11. {
  12. $nick = mysqli_real_escape_string($polaczenie, $nick);
  13. $komentarz = mysqli_real_escape_string($polaczenie, $komentarz);
  14. $zapytanie = "INSERT INTO `pdo`.`main` (`nick`, `data`, `komentarz`) VALUES ('$nick', NOW(), '$komentarz');";
  15. $polaczenie->query($zapytanie);
  16. }
  17.  
  18. ?>

Rozumiem, że teraz wszystko jest bezpieczne?
Go to the top of the page
+Quote Post
kapslokk
post
Post #10





Grupa: Zarejestrowani
Postów: 965
Pomógł: 285
Dołączył: 19.06.2015
Skąd: Warszawa

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


Tak.
Go to the top of the page
+Quote Post
Comandeer
post
Post #11





Grupa: Zarejestrowani
Postów: 1 268
Pomógł: 254
Dołączył: 11.06.2009
Skąd: Świętochłowice

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


Nie, nie jest! A czemu, to najlepiej wyjaśnia ta odpowiedź na SO: http://stackoverflow.com/a/8255054/5778385
Jedyny dobry sposób to PS: http://stackoverflow.com/a/60496/5778385


--------------------
Go to the top of the page
+Quote Post
com
post
Post #12





Grupa: Zarejestrowani
Postów: 3 034
Pomógł: 366
Dołączył: 24.05.2012

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


kapslokk ale nie pisz bazdur jakiekolwiek *_real_escape_string, nie chroni przed niczym, to się używało w mysql_* bo tylko to tam było, ale dlatego ten sposób już umarł wink.gif To nie daje nic, bo 95% współczesnych ataków przepuści wink.gif
Go to the top of the page
+Quote Post
kapslokk
post
Post #13





Grupa: Zarejestrowani
Postów: 965
Pomógł: 285
Dołączył: 19.06.2015
Skąd: Warszawa

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


No dobra, moja wina, szczerze mówiąc nawet nie wiedziałem sad.gif przyznaję się.
Go to the top of the page
+Quote Post
vento
post
Post #14





Grupa: Zarejestrowani
Postów: 21
Pomógł: 0
Dołączył: 17.02.2016

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


Może mi ktoś napisać przykład jak dodać bezpiecznie komentarz, aby nie było możliwe wstrzyknięcie sql dla mysqli
Póki co mam coś takiego:
  1. <?php
  2. include('connect.php');
  3. $nick = $_POST['nick'];
  4. $komentarz = $_POST['komentarz'];
  5. $polaczenie = @new mysqli($servername, $username, $password, $dbname);
  6. if ($polaczenie->connect_errno!=0)
  7. {
  8. echo "ERROR TO CONNECT MYSQL";
  9. }
  10. else
  11. {
  12. $nick = mysqli_real_escape_string($polaczenie, $nick);
  13. $komentarz = mysqli_real_escape_string($polaczenie, $komentarz);
  14. $zapytanie = "INSERT INTO `pdo`.`main` (`nick`, `data`, `komentarz`) VALUES ('$nick', NOW(), '$komentarz');";
  15. $polaczenie->query($zapytanie);
  16. }
  17.  
  18. ?>


Z góry dziękuję za pomoc..
Go to the top of the page
+Quote Post
Tomplus
post
Post #15





Grupa: Zarejestrowani
Postów: 1 879
Pomógł: 230
Dołączył: 20.03.2005
Skąd: Będzin

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


Jak użyjesz PDO to zapytanie będzie proste:

  1. $zapytanie = $polaczenie->prepare("INSERT INTO `pdo`.`main` (`nick`, `data`, `komentarz`) VALUES ( :nick , NOW(), :komentarz);");
  2. $zapytanie->bindValue(':nick', $nick);
  3. $zapytanie->bindValue(':komentarz', $komentarz);
  4. $zapytanie->execute();


mysqli_real_escape_string jest wtedy zbędne i usuwasz z kodu.


Jeżeli nie planujesz mieć skomplikowanych zapytań lub tabele będziesz miał referencyjne, to możesz użyć już klas ułatwiające otrzymywanie wyników, aktualizację i dodawanie treści do bazy danych np. klasę:
http://www.phpclasses.org/package/9209-PHP...tml#information

Dla przykładu:
  1. $db->table('main') /* nazwa tabeli */
  2. ->insert([
  3. 'nick' => $nick, /* nazwa kolumny jako klucz */
  4. 'komentarz' => $komentarz
  5. ]);


Ten post edytował Tomplus 24.05.2016, 06:22:46
Go to the top of the page
+Quote Post
vento
post
Post #16





Grupa: Zarejestrowani
Postów: 21
Pomógł: 0
Dołączył: 17.02.2016

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


Rozumiem, dziękuję za pomoc będę korzystał z PDO

  1. <?php
  2. include('connect.php');
  3. $nick = $_POST['nick'];
  4. $komentarz = $_POST['komentarz'];
  5. $polaczenie = @new mysqli($servername, $username, $password, $dbname);
  6. if ($polaczenie->connect_errno!=0)
  7. {
  8. echo "ERROR TO CONNECT MYSQL";
  9. }
  10. else
  11. {
  12. $zapytanie = $polaczenie->prepare("INSERT INTO `pdo`.`main` (`nick`, `data`, `komentarz`) VALUES (?, NOW(), ?);");
  13. $zapytanie->bind_param("ss", $nick, $komentarz);
  14. $zapytanie->execute();
  15. $zapytanie->close();
  16. }
  17.  
  18. ?>



Tak też może być?
Go to the top of the page
+Quote Post
com
post
Post #17





Grupa: Zarejestrowani
Postów: 3 034
Pomógł: 366
Dołączył: 24.05.2012

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


wywalisz małpę dodasz if z isset i będzie ok wink.gif
Go to the top of the page
+Quote Post
vento
post
Post #18





Grupa: Zarejestrowani
Postów: 21
Pomógł: 0
Dołączył: 17.02.2016

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


  1. <?php
  2. include('connect.php');
  3.  
  4. if( (isset($_POST['nick'])) && (isset($_POST['komentarz'])) )
  5. {
  6. $nick = $_POST['nick'];
  7. $komentarz = $_POST['komentarz'];
  8. $polaczenie = new mysqli($servername, $username, $password, $dbname);
  9. if ($polaczenie->connect_errno!=0)
  10. {
  11. echo "ERROR TO CONNECT MYSQL";
  12. }
  13. else
  14. {
  15. $zapytanie = $polaczenie->prepare("INSERT INTO `pdo`.`main` (`nick`, `data`, `komentarz`) VALUES (?, NOW(), ?);");
  16. $zapytanie->bind_param("ss", $nick, $komentarz);
  17. $zapytanie->execute();
  18. $zapytanie->close();
  19. }
  20. }
  21. else
  22. {
  23. exit();
  24. }
  25.  
  26. ?>


Teraz ok?

Ten post edytował vento 24.05.2016, 18:01:06
Go to the top of the page
+Quote Post
viking
post
Post #19





Grupa: Zarejestrowani
Postów: 6 380
Pomógł: 1116
Dołączył: 30.08.2006

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


Cytat(vento @ 24.05.2016, 17:04:54 ) *
Rozumiem, dziękuję za pomoc będę korzystał z PDO


Po czym korzystasz z mysqli wink.gif
Zamiast tych ifów poczytaj o wyjątkach.


--------------------
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: 20.08.2025 - 12:55