2010-09-15 8 views
54

Używam PDO po migracji z biblioteki mysql. Co używam zamiast starej funkcji real_escape_string?prawdziwy ciąg znaków escape i PDO

Potrzebuję uciec z pojedynczych cudzysłowów, więc pójdą one do mojej bazy danych i myślę, że może istnieć lepszy sposób radzenia sobie z tym bez dodawania slashów do wszystkich moich ciągów. Czy ktoś może mi powiedzieć, z czego powinienem skorzystać?

+1

Trochę późno do partii, ale można użyć PDO :: cytat(), jeśli metoda prepare() nie jest opcją (na przykład, gdy masz wbudowany własny model) –

Odpowiedz

30

Należy użyć PDO Prepare

Z linkiem:

Wywołanie PDO :: prepare() i PDOStatement :: execute() dla sprawozdań, które zostaną wyemitowane wielokrotnie z różnymi wartościami parametrów optymalizuje wydajność aplikacji, umożliwiając sterownikowi negocjowanie buforowania po stronie klienta i/lub serwera w planie kwerendy i meta-informacji, i pomaga zapobiegać atakom SQL injection, eliminując konieczność ręcznego podawania parametrów.

+0

Dzięki SteD. Czytałem to od pewnego czasu, ale od tego czasu usłyszałem, że przygotowanie PDO NIE przeszkodzi w iniekcji SQL. Nie jestem już pewien, w co wierzyć. Czy jesteś pewien, że przygotowanie przerwie atak iniekcyjny? – John

+1

@John po raz pierwszy słyszę, że ktoś usłyszał, że przygotowanie PDO NIE zapobiegnie iniekcji SQL. Czy jesteś pewien, że to naprawdę słyszałeś? Czy twoje źródło jest bardziej wiarygodne niż oficjalna dokumentacja? I uwaga, zawsze jest inny sposób, inny niż pytanie kogoś innego - możesz sam przeprowadzić badania ... –

+4

CHNP zapobiega iniekcjom SQL. (To nie pomaga w unikaniu xss, ale też nie mysql_real_escape) – nos

4

Użyj przygotowanych wyciągów. Te utrzymują dane i składnię oddzielnie, co eliminuje potrzebę ucieczki danych MySQL. Zobacz np. this tutorial.

+0

Piskvor, dzięki. Używam ich już nie tylko tam, gdzie dostaję błędy. Zastanawiałem się tylko, czy przygotowanie naprawdę powstrzymuje ataki przy wtrysku. Słyszałem, że jest inaczej i wydaje się, że toczy się o nie wiele debat. – John

+1

@John: Tak, przygotowane instrukcje zatrzymają ataki SQL injection. (Oczywiście zastrzyki SQL to tylko jeden z możliwych sposobów ataku, więc zapobieganie im nie jest magiczną "pyłą-twoją stroną-jest-teraz-w pełni bezpiecznym" pyłem) – Piskvor

+1

@John nie ma jednej debaty. Właściwie to tylko ty debatujesz. –

23

PDO oferuje alternatywę przeznaczone do zastąpienia mysql_escape_string() metodą PDO::quote().

Oto fragment ze strony PHP:

<?php 
    $conn = new PDO('sqlite:/home/lynn/music.sql3'); 

    /* Simple string */ 
    $string = 'Nice'; 
    print "Unquoted string: $string\n"; 
    print "Quoted string: " . $conn->quote($string) . "\n"; 
?> 

Powyższy kod wyjściowy:

Unquoted string: Nice 
Quoted string: 'Nice' 
+6

Obecnie jestem w trakcie migracji starego kodu do korzystania z PDO i podczas gdy rozwiązanie jest dobre, ludzie muszą zdawać sobie sprawę z tego, że będzie on umieszczał cytaty wokół napisu. Więc jeśli ludzie budują zapytania, które mają już cytaty typu: "SELECT * FROM users WHERE username = '". $ Conn-> quote ($ username). "'"; ', Zapytania nieuchronnie zawiodą. – user3158900

+5

Przyjęta odpowiedź może być zalecaną metodą i najlepszą praktyką, ale ta odpowiedź jest poprawną odpowiedzią na faktyczne pytanie. czasami potrzebujesz starej funkcji mysql_escape_string, na przykład jeśli tworzysz plik do wykonania później. nie możesz tego zrobić z przygotowanym oświadczeniem. –