2010-02-05 21 views

Répondre

16

Vous devez utiliser placeholders and bind values.

+1

'DBH-> bind()' est l'équivalent direct, mais comme le dit Sinan, ne faites pas cela. Faites-le correctement avec des espaces réservés et liez des valeurs. – mpeters

2

De 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

C'est l'article de Randal Schwartz "Comment éviter une crise d'injection SQL". Agréable. –

5

Comme quote?

Je vous recommande également de lire la documentation pour DBD::MySQL si vous êtes inquiet à propos d'utf8.

9

Ne pas. Échapper. SQL

Ne pas. Citation. SQL

Utilisez des espaces réservés SQL/paramètres (?). La structure de l'instruction SQL et les valeurs de données représentées par les espaces réservés sont envoyées à la base de données complètement séparément, donc (à moins d'un bogue dans le moteur de base de données ou le module DBD) les valeurs de données peuvent être interprétées comme SQL commandes.

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 

Comme un avantage secondaire, en utilisant des espaces réservés est également plus efficace si vous réutilisez votre instruction SQL (il ne doit être préparé une fois) et pas moins efficace si vous ne le faites pas (si vous ne le faites pas call prepare explicitement, il est toujours appelé implicitement avant l'exécution de la requête).