2011-01-20 11 views
6

Biorąc pod uwagę następujący fragment kodu, Czy muszę uciec i odkażać $city?Czy muszę odkażać dane wejściowe, jeśli korzystam z przygotowanych zapytań PHP/MySQL?

<?php 
$mysqli = new mysqli("localhost", "my_user", "my_password", "world"); 

/* check connection */ 
if (mysqli_connect_errno()) { 
    printf("Connect failed: %s\n", mysqli_connect_error()); 
    exit(); 
} 

$city = "Amersfoort"; 

/* create a prepared statement */ 
if ($stmt = $mysqli->prepare("SELECT District FROM City WHERE Name=?")) { 

    /* bind parameters for markers */ 
    $stmt->bind_param("s", $city); 

    /* execute query */ 
    $stmt->execute(); 

    /* bind result variables */ 
    $stmt->bind_result($district); 

    /* fetch value */ 
    $stmt->fetch(); 

    printf("%s is in district %s\n", $city, $district); 

    /* close statement */ 
    $stmt->close(); 
} 

/* close connection */ 
$mysqli->close(); 
?> 

Czy należy odkażać dane wejściowe podczas korzystania z przygotowanych zapytań?

Odpowiedz

8

@Gary: Skopiowano że fragment kodu prosto z podręcznika na php.net o mysqli :: przygotować. Na tej samej stronie znajduje się następujący tekst:

"Celem przygotowanych wyciągów jest niewłączanie danych do instrukcji SQL. Włączenie ich do instrukcji SQL NIE jest bezpieczne. Zawsze używaj przygotowanych instrukcji. kod jest łatwiejszy do odczytania) i nie podatny na iniekcje SQL. "

Jaka jest odpowiedź na pytanie;)

+4

Drzewa stanęły na drodze do lasu. ;) –

+0

Tak, ale przygotowane instrukcje często wymagają więcej zasobów zarówno na warstwie aplikacji, jak i na warstwie danych - zachowaj ostrożność, gdy zobaczysz, że ktoś mówi: "zawsze używaj przygotowanych instrukcji". – Jmoney38

+0

@ Jmoney38 Uważam, że każde rozwiązanie powinno być starannie przemyślane, a nie tylko wybierane, ponieważ wydaje się, że jest to powszechna praktyka. – Sander

1

dodatkowo. Dodatkowo.

Przygotowane statueny, jeśli są używane poprawnie, niemal całkowicie łagodzą problemy z iniekcją SQL. Ale mimo wszystko należy sformatować/odświeżyć dane wejściowe. Czyszczenie danych wejściowych nie jest funkcją zabezpieczającą, ale jest zalecane dla niezawodności i użyteczności. W przypadku Twojej $ city, można rozebrać wszystkie znaki inne niż słowo:

$city = trim(preg_replace("/[^\w-]+/", " ", $city)); 

Jakie znowu: nie zastępuje bazę ucieczki lub przygotowane oświadczenia, ale zapewnia spójne dane pracować.

+0

Ale to nie jest sanityzacja (usuń wszelkie nielegalne znaki z danych.), Ale sprawdzanie poprawności. Są to 2 różne rzeczy. Powinieneś zawsze sprawdzać swoje dane nawet przy pomocy przygotowanych wyciągów. – viery365

0

Zdaję sobie sprawę, że to pytanie jest bardzo stare. Natknąłem się na to, szukając tych samych informacji. Chciałbym skomentować odpowiedź Sandera, ale nie mam jeszcze wystarczającej reputacji, aby ją skomentować.

Sander mówi, że nie musisz dezynfekować, ale pod numerem http://www.w3schools.com/php/php_mysql_prepared_statements.asp (i zdaję sobie sprawę, że w3schools nie zawsze jest całkowicie aktualnym i dokładnym źródłem informacji, ale uważam, że jest to pisane w rozsądny i łatwy sposób zrozumieć sposób), mówią: "Uwaga: jeśli chcemy wstawić jakiekolwiek dane z zewnętrznych źródeł (takich jak dane wejściowe użytkownika), bardzo ważne jest, aby dane zostały oczyszczone i zatwierdzone."

Wygląda na to, że przy korzystaniu z formularzy i przyjmowaniu danych wprowadzanych przez użytkownika należy odkażać.

Powiązane problemy