Qualcuno potrebbe dirmi se esiste una funzione che funziona allo stesso modo di PHP mysql_real_escape_string()
per Perl dal modulo DBI?Esiste un equivalente di mysql_real_escape_string() di PHP per DBI di Perl?
risposta
È necessario utilizzare placeholders and bind values.
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
Questo è l'articolo di Randal Schwartz "Evitare attacchi SQL Injection". Bello. –
come quote?
Vorrei anche leggere la documentazione per DBD::MySQL se siete preoccupati per utf8.
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).
Database maniglia Metodo "quote"
my $dbh = DBI->connect(...);
$sql = sprintf "SELECT foo FROM bar WHERE baz = %s",
$dbh->quote("Don't");
'DBH-> bind()' è l'equivalente diretto, ma come dice Sinan, non farlo. Fallo correttamente con i segnaposti e i valori di bind. – mpeters