2011-01-07 5 views
5

Sono novizio con le librerie PDO. Sto lavorando all'ambiente di sviluppo con mysql come database. Sono in grado di scorrere le mie query utilizzando la funzione di preparazione ed esecuzione mentre si utilizza "?" segnaposto e anche metodo bindParam durante l'utilizzo di segnaposto con nome (es: ": colonna").Come sappiamo che il PDO sta sfuggendo alle iniezioni SQL?

Dopo questo tentativo, ho provato a vedere se PDO esegue qualsiasi tipo di escape inserendo virgolette per disinfettare la query come mysql_real_escape_string. Sto cercando di vedere l'aspetto della query, ma tutto quello che ottengo è la dichiarazione che è stata passata nell'istruzione preparativa, ma non la query che sarebbe stata eseguita.

Ho provato a var_dump il $ result-> execute() e $ result-> fetch() ma l'istruzione execute mi dà il sql della mia istruzione preparata con i segnaposto mentre l'istruzione fetch mi dà il risultato di quella query.

C'è un modo per esaminare la query di ricerca che verrà eseguita, o almeno come i parametri dovrebbero apparire prima di eseguire la query ??

Spero di essere chiaro con la mia domanda. : |

+1

ti preoccupi troppo. Le dichiarazioni preparate sfuggono al tuo input al 100%. Se è necessario vedere come appare la query finale, è necessario impostare un registro delle query del database. – netcoder

+1

@netcoder Le istruzioni preparate non sfuggono a nulla (se non in modalità compatibile). E non c'è nulla di nuovo nel registro delle query –

+0

@Col. Shrapnel: Beh tecnicamente sì, anche se puoi esprimerlo nel modo desiderato. Per quanto riguarda "non c'è nulla di nuovo nel registro delle query", semplicemente non capisco cosa significhi ... – netcoder

risposta

6

Quando si scrive qualcosa di simile:

$stmt = $pdo->prepare('SELECT * FROM tbl_name WHERE col_name = :col_name;'); 
$stmt->bindValue('col_name', 'some \' value'); 
$stmt->execute(); 

Il la query effettiva è ... SELECT * FROM tbl_name WHERE col_name = :col_name;. Questo è chiamato istruzione preparata. In primo luogo, si invia una query al database, in seguito si inviano parametri di query. PDO non unisce query e parametri.

Probabilmente avete pensato che PDOStatement::bindValue() fa qualcosa di simile:

public function bindValue($placeholer, $value, $valueType = PDO::PARAM_STR) { 
    $this->query = str_replace($placeholder, $this->quote($value, $valueType), $this->query); 
} 

Ma non lo fa.

Si fa qualcosa di più simile a quello:

public function execute() { 
    try { 
     $this->sendQueryToDatabase($this->query); 

     // Query is valid 
     $this->sendParametersToDatabase($this->parameters); 

     return $this->fetchResultSet(); 
    } catch (... $e) { 
     // Query is invalid (eg. syntax error) 
     throw ...; 
    } 
} 

Read more about Prepared Statements

+0

quindi come faremo a sapere se i parametri inviati sono sicuri ?? dobbiamo controllarli prima della mano ??? – macha

+2

I parametri non possono essere pericolosi in quanto non fanno parte della query. Sono solo dati grezzi. – Crozin

+0

hey So che potrebbe essere un livello un po 'troppo alto, hai qualche idea su come la query verrebbe analizzata e come potrebbero essere inviati/sostituiti con i segnaposto questi parametri? – macha

1

la dichiarazione preparare è gestire da MySQL, in modo da PDO non sfuggire alla richiesta, DOP inviare la richiesta e "dopo" il parametro

+0

Non so perché si sta svendendo, questo è vero. – netcoder

+0

Questo non è vero, PDO emula solitamente le istruzioni preparate, poiché le istruzioni preparate sul lato server, sebbene supportate, non sono generalmente una buona idea. – MarkR

+0

@MarkR solo in modalità di compatibilità che è già obsoleto –

-1

Abilitare il registro generale di query, e guardare le query effettivamente eseguite sul server quando si sta eseguendo semplici dichiarazioni - fare alcuni inserti , ad esempio, con stringhe contenenti virgolette o nulle incorporate.

+0

Non vedrà nulla di nuovo –

3

Per dirlo.

DOP ha 2 modalità di esecuzione di istruzioni preparate:

  1. modalità nativa. Richiesta e dati inviati al database se-pa-ra-te-ly. Il che significa che i dati non sono mai stati aggiunti alla query per. Quindi, nessun danno potrebbe essere fatto. Mai. La query inviata al database così com'è, con ? contrassegni (ma nessun segnaposto con nome che viene sostituito da PDO con ? s)
  2. Modalità compatibilità. PDO crea una query vecchio stile, sostituendo i segnaposti con variabili bindate a seconda del nome della variabile. Stringhe che vengono citate/fugate, il resto viene trasmesso al suo tipo.

Entrambi i metodi sono perfettamente sicuri.

Il vero pericolo comincia quando si dispone di una variabile identificatore ...

+0

perché l'identificatore di variabile è pericoloso ?? Pensavo che fosse più sicuro visto che abbiamo persino verificato il tipo di dati? – macha

+0

@macha Intendo un nome di campo. Ad esempio, 'SELECT * FROM table ORDER BY $ column_name' è effettivamente pericoloso –

+0

OK !! Grazie per la risposta. – macha