2010-02-05 10 views

Odpowiedz

16

Powinieneś użyć placeholders and bind values.

+1

'DBH-> bind()' jest bezpośrednim odpowiednikiem, ale jak mówi Sinan, nie rób tego. Zrób to poprawnie z symbolami zastępczymi i wartościami wiązania. – mpeters

2

Od 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

To artykuł Randal Schwartz "Unikanie Ataki SQL Injection". Miły. –

5

Jak quote?

Polecam również przeczytanie dokumentacji dla DBD::MySQL, jeśli martwisz się o utf8.

9

Nie. Ucieczka. SQL.

Nie. Zacytować. SQL.

Użyj symboli zastępczych SQL/parametrów (?). Struktura instrukcji SQL i wartości danych reprezentowane przez symbole zastępcze są wysyłane do bazy danych całkowicie oddzielnie, więc (z wyjątkiem błędu w silniku bazy danych lub module DBD) nie ma absolutnie żadnego sposobu, aby wartości danych mogły być interpretowane jako SQL polecenia.

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 

jako korzyść bocznej, przy użyciu symboli zastępczych jest także bardziej efektywne, jeśli ponownie użyć SQL (tylko musi być przygotowany raz) i nie mniej skuteczne, jeśli nie (jeśli nie Zadzwoń, przygotuj się jawnie, wciąż jest wywoływany niejawnie przed wykonaniem zapytania).

Powiązane problemy