Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: PDO zabezpieczenia ?
Forum PHP.pl > Forum > PHP
smiady
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 ?
Damonsson
To co robisz w execute to właśnie skrócone bindowanie. Tak się nie da nic wstrzyknąć.
smiady
W zasadzie bindValue mija się trochę z celem, bo raz, że jest dłuższe w zapisie, to i tak trzeba stosować execute potem.
Michael2318
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 smile.gif
Damonsson
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.
redeemer
@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.
Spawnm
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.
Michael2318
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 smile.gif
smiady
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.
Michael2318
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.
smiady
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 smile.gif
Crozin
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();
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.