2010-06-29 18 views
15

Na PDO::Prepare page to stwierdza,Czy instrukcje przygotowane w PHP PDO muszą zostać usunięte?

"i pomaga zapobiegać atakom SQL injection, eliminując konieczność ręcznego zacytować parametry"

Wiedząc o tym, czy istnieje funkcja PHP jak mysql_real_escape_string() która zajmuje się ucieczką użądlenia dla ChNP? A może PDO zajmuje się dla mnie ucieczką?

EDIT

teraz zdaję sobie sprawę, że poprosiłem niewłaściwe pytanie. Moje pytanie brzmiało: "O co wszyscy się troszczą o PDO?" Teraz zdaję sobie sprawę z tych odpowiedzi, że tak naprawdę to tylko eliminuje potrzebę ucieczki od cytatów. Ale nadal musiałbym wykonywać inne wywołania sanityzacji PHP na wartościach, które przekazuję do funkcji execute. Takich jak htmlentities(), strip_tags() ... etc ...

+5

Nie ma uniwersalnej funkcji "sanityzacji" na świecie. To jest jak prawdziwe życie: mycie rąk, używanie prezerwatyw i przechowywanie pieniędzy w bezpiecznej skrzyni są dla bezpieczeństwa. Ale to nie znaczy, że twoje jabłko, umyte i owinięte w prezerwatywę i umieszczone w bezpiecznej skrzyni, uważane za bezpieczne. Każda funkcja sanityzacji jest dla własnego celu. Nie pytaj o bezpieczeństwo HTML z funkcji bazy danych. To byłoby dziwne. –

+0

@ Col. Shrapnel +1 Nice example lol ..... – Metropolis

Odpowiedz

24

CHNP nie wymyka się zmiennym. Zmienne i polecenie SQL są przesyłane niezależnie przez połączenie MySQL. I tokenizer SQL (parser) nigdy nie analizuje wartości. Wartości są dosłownie kopiowane dosłownie do pamięci bazy danych bez możliwości wyrządzenia szkody. Dlatego nie ma potrzeby gromadzenia danych za pomocą przygotowanych oświadczeń.

Należy pamiętać, że jest to głównie przewaga prędkości. Używając mysql_real_escape_string(), najpierw skonfiguruj zmienne w PHP, następnie wyślij nieefektywne polecenie SQL do serwera, który musi kosztownie oddzielić aktualne polecenie SQL od wartości. Dlatego często mówi się, że przewaga w zakresie bezpieczeństwa jest tylko ukryta, a nie głównym powodem korzystania z PDO.

Jeśli Concat polecenia SQL, a nie faktycznie używać przygotowanych statments, to tak, nadal jest funkcją ucieczki dla PDO (nie dobrze!): $pdo->quote($string)

+0

W rzeczywistości jest to niepoprawne. Zarówno pdo, jak i adodb używają 'mysql_real_escape_string()' po połączeniu z mysql. Sprawdziłem kod. – rook

+1

@Col. Shrapnel pdo jest napisany w języku C++, a adodb jest napisany w php. Oba używają mysql_real_escape_string() (który jest poza oficjalną biblioteką klienta mysql). W pewnym momencie musisz wyjść z wejścia, nie ma innej drogi. – rook

+2

@ Wieża: Gauging z http://svn.php.net/viewvc/php/php-src/trunk/ext/pdo_mysql/mysql_statement.c?revision=299574&view=markup może zależeć od sterownika backendu. Nowy mysqlnd z pewnością korzysta z prawdziwych przygotowanych statystyk, podczas gdy starszy może powrócić na PDO_ATTR_EMULATE_PREPARES i uciekać/konkatenować. W końcu jest to jedna z reklamowanych funkcji PDO do emulacji **, jeśli ** nie jest dostępna. – mario

1

Nie musisz się tym martwić. PDO nie wymaga ucieczki od danych przed przekazaniem ich do bazy danych.

Edit: Wystarczy być jasne, chcę powiedzieć, że tak długo, jak jesteś przechodząc do swoich zmiennych parametrów (na przykład, wartość pola formularza), nie musisz się o to martwić. Jednakże, jeśli podajesz zmienne, które zdefiniowałeś jako łańcuchy, na przykład, to oczywiście musisz uciec od wszystkiego, co wymaga ucieczki w tym łańcuchu, aby uniknąć łamania składni. Nie miałoby to jednak większego sensu, ponieważ jedną z głównych zalet PDO jest to, że przekazujesz informacje od użytkownika do bazy danych bez potrzeby dezynfekcji go samemu, a nie ma ich wiele razy (jeśli w ogóle). że przechodzisz przez struny, które sam zdefiniowałeś.

Upewnij się, że nadal odkażasz swoje dane pod numerem typu. Na przykład, upewnij się, że jest to liczba całkowita, jeśli można oczekiwać, że będzie, upewnij się, że jest mniejsza lub większa niż x, jeśli można oczekiwać, że będzie, itp

+0

OK cool .... więc wszystkie specjalne postacie powinny być załatwione? Podobnie jak znaczniki HTML, cytaty ... itd. – Metropolis

+0

Zakładając, że wiążisz parametry do przygotowanej instrukcji, tak. (Oczywiście, jeśli sam piszesz tekst w kodzie PHP, na przykład w zmiennej, to trzeba uciec, aby nie zakłócać składni). –

+2

@ Tagi html Metropolis nie mają nic wspólnego z SQL, a Cytaty nie mają znaczenia dla powiązania, ponieważ nie ma żadnych ograniczników otaczających cytatów - więc nic do ucieczki. –

7

tak i nie:

  • literałów którego osadzone w łańcuchu instrukcji muszą być normalne.
  • Wartości, które łączysz z przygotowaną instrukcją, są obsługiwane przez bibliotekę.
+0

Dobrze, to ma sens – Metropolis

+0

, więc jeśli używam metody bindParm, nie muszę uciekać od niczego, aby zapobiec wstrzyknięciu, prawda? – Patareco

+1

@Patareco Wartości przekazane do 'PDOStatement :: bindValue()' lub 'PDOStatement :: bindParam()' (jest ważna różnica!) Powinny być obsługiwane poprawnie przez PDO. Nie powinieneś uciec przed nimi, bo zostaną one zapisane w bazie danych. Nie robię żadnych gwarancji; mogą występować błędy w PDO/PHP/MySQL, które umożliwiają wstrzyknięcie. Musisz również poprawnie obsługiwać dane wyjściowe, aby zapobiec iniekcji skryptu. –

3

Jeśli przygotowujesz oświadczenie i używasz bindParam lub bindValue do dostarczania zmiennych, nie musisz wymykać zmiennych. Zauważ, że te funkcje zakładają, że zmienna zawiera ciąg, więc użyj trzeciego parametru do bindValue, jeśli chcesz użyć wartości zmiennych lub zmiennych.

+0

Im przy użyciu przygotować i wykonać ..... Nie używam funkcji bindParam lub bindValue. – Metropolis

+1

@ Metropolis: W porządku. Jeśli zdasz znak zapytania? lub: nazwane parametry jako argumenty -> execute(), ma taki sam efekt jak bindParam. Tylko pamiętaj, że powinny one wtedy odwoływać się do kolumn tekstowych. – mario

6

Bardzo niewiele osób rozumie, co tu jest i ucieczki kiedy go użyć.
Ucieczka nie powoduje, że dane są "bezpieczne". po prostu unikają ograniczników, aby odróżnić ogranicznik od części danych. field = 'it's me' spowoduje błąd, a field = 'it\'s me' nie. To jedyny cel ucieczki. Tak więc działa tylko wtedy, gdy używasz cytatów. Jeśli tego nie zrobisz - ucieczka stanie się bezużyteczna.

Czy używasz ofert z symbolami zastępczymi? Nie. Dlatego ucieczka nie byłaby sensowna.

Po użyciu wiązania działa to w bardzo różny sposób.
Nie wysyła całego zapytania do serwera, ale wysyła przygotowane zapytanie oddzielnie od danych powiązanych. Więc nie może się wtrącać. I w ten sposób nie ma możliwości wstrzyknięcia.

+0

Bardzo doskonała i odpowiednia odpowiedź. Szczególnie ostatni akapit. –

Powiązane problemy