2010-02-05 11 views

Respuesta

16
+1

'DBH-> bind()' es el equivalente directo, pero como dice Sinan, no hagas eso. Hágalo correctamente con marcadores de posición y valores de enlace. – 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

Ese es el artículo de Randal Schwartz "Cómo evitar ataques de inyección SQL". Bonito. –

5

Como quote?

También recomendaría leer la documentación para DBD::MySQL si está preocupado por utf8.

9

No. Escapar. SQL.

No. Citar. SQL.

Utilice los marcadores/marcadores de posición SQL (?). La estructura de la declaración SQL y los valores de datos representados por los marcadores de posición se envían a la base de datos completamente por separado (salvo un error en el motor de base de datos o el módulo DBD) no hay forma de que los valores de datos puedan interpretarse como SQL comandos.

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 

Como beneficio adicional, el uso de marcadores de posición también es más eficiente si se vuelve a utilizar la instrucción SQL (que sólo tiene que estar preparado una vez) y no menos eficaz si no lo hace (si no lo hace llamada prepararse explícitamente, todavía se llama implícitamente antes de que se ejecute la consulta).

Cuestiones relacionadas