Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> PDO zabezpieczenia ?
smiady
post
Post #1





Grupa: Zarejestrowani
Postów: 137
Pomógł: 2
Dołączył: 2.07.2007
Skąd: Ostrzeszów

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


Witam.

Mam pytanie odnośnie PDO i wstrzykiwania kodu.
Otóż mam taki fragment:

  1. $db= new PDO('mysql:host=localhost;dbname=test', 'root', '');
  2.  
  3. $sql= "SELECT id FROM uzytkownicy WHERE login= :login AND haslo= :haslo";
  4. $login= $db->prepare($sql);
  5.  
  6. $login->execute(array(':login' => $_REQUEST['login'],
  7. ':haslo' => $_REQUEST['haslo']));
  8. if($login->fetch()) echo 'zostałeś zalogowany !';
  9. else echo 'niestety nie zostałeś zalogowany !';


i gdy w loginie wpisuje np test' -- (po myślnikach jeszcze spacja) to nie da się zalogować, a w przypadku mysqli bez użycia real_escape_string już da.
Myślałem, że bindValue ma zabezpieczenia, a czy execute je też tworzy ? czy w przypadku PDO kod się inaczej wstrzykuje - jeśli tak to jak ?
Go to the top of the page
+Quote Post
Damonsson
post
Post #2





Grupa: Zarejestrowani
Postów: 2 355
Pomógł: 533
Dołączył: 15.01.2010
Skąd: Bydgoszcz

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


To co robisz w execute to właśnie skrócone bindowanie. Tak się nie da nic wstrzyknąć.
Go to the top of the page
+Quote Post
smiady
post
Post #3





Grupa: Zarejestrowani
Postów: 137
Pomógł: 2
Dołączył: 2.07.2007
Skąd: Ostrzeszów

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


W zasadzie bindValue mija się trochę z celem, bo raz, że jest dłuższe w zapisie, to i tak trzeba stosować execute potem.
Go to the top of the page
+Quote Post
Michael2318
post
Post #4





Grupa: Zarejestrowani
Postów: 651
Pomógł: 116
Dołączył: 3.06.2012
Skąd: Lędziny

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


PDO ogólnie ma taką ideę, że nie musisz w ogóle myśleć nad jakimikolwiek zabezpieczeniami bo PDO samo sobie z filtracją poradzi, Ty jedynie co to możesz ew. zdefiniować podczas bindowania czy chcesz otrzymać wartość liczbową (INT) czy tekst (STR), tyle.

Ja na Twoim miejscu bindowałbym te wartości (IMG:style_emoticons/default/smile.gif)

Ten post edytował Michael2318 25.06.2014, 22:42:56
Go to the top of the page
+Quote Post
Damonsson
post
Post #5





Grupa: Zarejestrowani
Postów: 2 355
Pomógł: 533
Dołączył: 15.01.2010
Skąd: Bydgoszcz

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


Nie prawda, powinno się stosować bindValue/Param i ogólnie wszędzie tak się stosuje.

Poza tym tutaj w execute wymuszony jest string, w bindValue/Param możesz przesłać parametr jako INT na przykład.
Go to the top of the page
+Quote Post
redeemer
post
Post #6





Grupa: Zarejestrowani
Postów: 915
Pomógł: 210
Dołączył: 8.09.2009
Skąd: Tomaszów Lubelski/Wrocław

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


@Michael2318: Nie zgadzam się. Trzeba pamiętać, że używanie PDO nie zwalnia z myślenia i czasami (zwłaszcza dla mało doświadcznych programistów) może dawać złudne poczucie "bezpieczeństwa". Często się zdarzają błędy typu SQL injection, pomimo "używania" PDO.
Go to the top of the page
+Quote Post
Spawnm
post
Post #7





Grupa: Moderatorzy
Postów: 4 069
Pomógł: 497
Dołączył: 11.05.2007
Skąd: Warszawa




PDO nic nie pomoże jeśli ktoś wsadzi $_GET/$_POST do sqla w stylu $sql = "SELECT * FROM foo WHERE id=".$_GET['id'];
Nadal będziemy mieć podatność mimo super pdo.
Go to the top of the page
+Quote Post
Michael2318
post
Post #8





Grupa: Zarejestrowani
Postów: 651
Pomógł: 116
Dołączył: 3.06.2012
Skąd: Lędziny

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


Dlatego dodałem, że jedyne co musi zrobić to zbindować daną wartość i określić czy spodziewa się stringa czy wartości liczbowej (int) w rezultacie (IMG:style_emoticons/default/smile.gif)

Ten post edytował Michael2318 26.06.2014, 08:05:03
Go to the top of the page
+Quote Post
smiady
post
Post #9





Grupa: Zarejestrowani
Postów: 137
Pomógł: 2
Dołączył: 2.07.2007
Skąd: Ostrzeszów

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


Mówicie, że z bindValue należy korzystać, bo określasz czego się spodziewasz, więc zrobiłem test

  1. $sql= "INSERT INTO liczby(liczba1, liczba2, liczba3) VALUES(:liczba1, :liczba2, :liczba3)";
  2. $liczby= $db->prepare($sql);
  3.  
  4. $liczby->execute(array(':liczba1' => $_REQUEST['liczba1'],
  5. ':liczba2' => $_REQUEST['liczba2'],
  6. ':liczba3' => $_REQUEST['liczba3']));


gdzie liczba1 to int, liczba2 to double, liczba3 to string. Podaje liczby i nie ma problemu zapisuje w bazie, więc w sumie zastanawiam się nad sensem stosowania bindValue.
Jak np podam test, test, test to zapisze 0, 0, test, jak 1test, 2test, 3test to zapisze 1, 2, 3, czyli w sumie execute ładnie parsuje.

Ten post edytował smiady 26.06.2014, 20:12:21
Go to the top of the page
+Quote Post
Michael2318
post
Post #10





Grupa: Zarejestrowani
Postów: 651
Pomógł: 116
Dołączył: 3.06.2012
Skąd: Lędziny

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


smiady, zauważ, że tak czy siak w pewnym sensie filtrujesz te dane, tyle że nie przez bindvalue, a przez execute. Ważne, że nie puszcza się tych danych na ślepo, tak jak zapodał to Spawn w przykładzie.
Go to the top of the page
+Quote Post
smiady
post
Post #11





Grupa: Zarejestrowani
Postów: 137
Pomógł: 2
Dołączył: 2.07.2007
Skąd: Ostrzeszów

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


OK, Michael2318 zgadam się. Tylko zwracam uwagę na to co napisał Damonsson, że execute wymusza zawsze string i nie powinno się tak robić, ale w sumie jak się poda int to nic złego się nie stanie (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
Crozin
post
Post #12





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

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


1. Wszystkie zmienne w $_GET/$_POST/$_COOKIE/$_REQUEST są stringami, chyba że wcześniej w kodzie nadpisałeś ich wartość.
2. PDOStatement::execute z argumentem to nic innego jak skrócona forma:
  1. $stmt->bindValue(':abc', 'wartosc', PDO::PARAM_STR);
  2. $stmt->bindValue(':def', 'wartość', PDO::PARAM_STR);
  3. $stmt->bindValue(':ghi', 123, PDO::PARAM_STR); // taki zapis jest również poprawny
  4. $stmt->execute();
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 24.08.2025 - 09:03