2011-01-20 10 views
6

Dato il seguente pezzo di codice, Devo scappare e disinfettare lo $city?Devo disinfettare l'input se si utilizzano query PHP/MySQL preparate?

<?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(); 
?> 

È necessario disinfettare qualsiasi input quando si utilizzano query preparate?

risposta

9

No, non è necessario evitarlo o disinfettarlo per la protezione dell'iniezione. Per altre cose specifiche delle app puoi comunque sanitizzarlo.

avevo una domanda simile un po 'indietro:

mysqli_stmt_bind_param SQL Injection

8

@Gary: è stato copiato quel frammento di codice direttamente dal manuale in php.net circa mysqli :: Prepare. Sulla stessa pagina è il seguente testo:

"Lo scopo delle istruzioni preparate è quello di non includere dati nelle istruzioni SQL, includerli nelle istruzioni SQL NON è sicuro. Utilizzare sempre dichiarazioni preparate. codice più facile da leggere) e non incline alle iniezioni SQL. "

Qual è la risposta alla tua domanda;)

+4

Gli alberi si intromettevano nel bosco. ;) –

+0

Sì, ma le dichiarazioni preparate richiedono spesso più risorse sia a livello di applicazione che a livello di dati: fare attenzione quando si vede qualcuno dire "usa sempre istruzioni preparate". – Jmoney38

+0

@ Jmoney38 A occhio, penso che ogni soluzione dovrebbe essere pensata attentamente, invece di prenderla perché sembra essere una pratica comune. – Sander

1

Inoltre. Inoltre.

Gli statemi preparati, se utilizzati correttamente, attenuano quasi del tutto i problemi di SQL injection. Tuttavia, è necessario formattare/disinfettare i dati di input laddove necessario. L'input di pulizia non è una funzione di sicurezza, ma consigliabile per robustezza e usabilità. In caso di vostro $ city, si potrebbe desiderare per togliere tutti i caratteri non-parola:

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

Che ancora una volta: non sostituisce database di fuga o di istruzioni preparate, ma assicura dati coerenti con cui lavorare.

+0

Ma questo non sta disinfettando (rimuove qualsiasi carattere illegale dai dati.), Ma convalida. Sono 2 cose diverse. Dovresti sempre convalidare i tuoi dati anche con dichiarazioni preparate. – viery365

0

Mi rendo conto che questa domanda è molto vecchia. Mi sono imbattuto in esso mentre cercavo le stesse informazioni da solo. Vorrei commentare la risposta di Sander, ma non ho abbastanza reputazione per commentare ancora.

Sander dice che non è necessario disinfettare, ma al (e mi rendo conto che w3schools non è sempre una fonte di informazioni aggiornata e accurata, ma trovo che spieghi le cose in modo sensato, facile da capire i modi), dicono "Nota: se vogliamo inserire dati da fonti esterne (come l'input dell'utente), è molto importante che i dati siano disinfettati e convalidati."

Quindi sembra che quando si utilizzano i moduli e accettare l'input utente, si dovrebbe sterilizzare.

Problemi correlati