2010-02-05 11 views

risposta

16

È necessario utilizzare placeholders and bind values.

+1

'DBH-> bind()' è l'equivalente diretto, ma come dice Sinan, non farlo. Fallo correttamente con i segnaposti e i valori di bind. – mpeters

2

Da http://www.stonehenge.com/merlyn/UnixReview/col58.html:

 
    use SQL::Abstract; 
    ... 
    my $sqa = SQL::Abstract->new; 
    my ($owner, $account_type) = @_; # from inputs 
    my ($sql, @bind) = $sqa->select('account_data', # table 
            [qw(account_id balance)], # fields 
            { 
            account_owner => $owner, 
            account_type => $account_type 
            }, # "where" 
           ); 
    my $sth = $dbh->prepare_cached($sql); # reuse SQL if we can 
    $sth->execute(@bind); # execute it for this query 
+0

Questo è l'articolo di Randal Schwartz "Evitare attacchi SQL Injection". Bello. –

5

come quote?

Vorrei anche leggere la documentazione per DBD::MySQL se siete preoccupati per utf8.

9

No. Fuga. SQL.

No. Citazione. SQL.

Utilizzare segnaposti/parametri SQL (?). La struttura dell'istruzione SQL e i valori dei dati rappresentati dai segnaposto vengono inviati al database completamente separatamente, quindi (salvo un bug nel motore del database o nel modulo DBD) non è assolutamente possibile che i valori dei dati possano essere interpretati come SQL comandi.

my $name = "Robert'); DROP TABLE Students; --"; 
my $sth = $dbh->prepare('SELECT id, age FROM Students WHERE name = ?'); 
$sth->execute($name); # Finds Little Bobby Tables without harming the db 

Come beneficio collaterale, usando segnaposti è anche più efficiente se si ri-utilizzare l'istruzione SQL (ha solo bisogno di essere preparati una volta) e non meno efficace se non lo fanno (se non lo fai chiamata preparare in modo esplicito, viene ancora chiamata implicitamente prima dell'esecuzione della query).

Problemi correlati