Originariamente inviata da
.Kurt
E' dal primissimo post che te lo abbiamo detto!
Ci prendi in giro?
Scusa sarò anche ignorante, ma stai confondendo gli statement PDO con quelli mysql.
Visto che mi piace controllare questo codice PHP, scritto or ora (lascia stare che è fatto coi piedi, è un pezzo preso dal codice vero)
codice:
$gf_tabella=DB_NAME.'.wanazioni';
try
{
$conn = new PDO(DB_DSN,DB_USER,DB_PASSWORD);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}
try
{
$statement = $conn->prepare("INSERT INTO ".$gf_tabella."
(data,utente,tipoazione,id,payload1,payload2,payload3,nomecomputer,idwan,idlinkriga)
VALUES
(now(),:utente,'PRESAINCARICO',:id,:utente,concat('In data ',now()),:computer,:ip,:idwan,upper(sha1(uuid()))) ");
}
$utente="Pippo";
$value=100;
$miocomputer="pluto";
$idwan=0;
$ip='127.0.0.1';
$statement->bindParam(':utente', $utente);
$statement->bindParam(':id', $value);
$statement->bindParam(':computer', $miocomputer);
$statement->bindParam(':idwan', $idwan);
$statement->bindParam(':ip', $ip);
try
{
$statement->execute();
echo "tutto OK";
}
usa gli statement PDO, e quindi è "supersicuro", ed è inutile sapere come funziona (secondo le teorie di chi ne sa di più).
Bene, attivando il log delle query il comando sopra diventa questo (fatto fresco fresco)
codice:
C:\Program Files\MariaDB 5.5\bin\mysqld.exe, Version: 5.5.34-MariaDB-log (mariadb.org binary distribution). started with:
TCP Port: 3306, Named Pipe: (null)
Time Id Command Argument
150914 20:23:02 1 Connect root@localhost as anonymous on dbz
1 Query INSERT INTO dbz.wanazioni
(data,utente,tipoazione,id,payload1,payload2,payload3,nomecomputer,idwan,idlinkriga)
VALUES
(now(),'Pippo','PRESAINCARICO','100','Pippo',concat('In data ',now()),'pluto','127.0.0.1','0',upper(sha1(uuid())))
1 Quit
che come vedi è una normalissima insert ACCODATA (giustapposta o come si dice) , non è uno statement preparato mysql.
Evidentemente PDO si limite a "accodare" per i fatti suoi costruendo la query creando una stringa esattamente come si fa con lo sconsigliatissimo metodo mysql "vecchio", non genera un "vero" statement preparato per mysql.
Il risultato netto, però, è che se "riescere a prendedere in giro PDO" (ad esempio come con il buco drupal, che usa un metodo che a me ignorante sembra pressochè identico) ottieni un NORMALISSIMO comando mysql del tipo soggetto a SQL injection.
Può accadere questo? Non lo so, sono indubbiamente ignorante, però mi piace cercar di capire come funzionano davvero le cose, senza limitarmi a "l'hanno scritto in 1000 e sarà perfetto", quando poi passo i pomeriggi a decrittare faticosamente siti che demoliscono le presunte certezze.