2010-02-05 30 views

Trả lời

16

Bạn nên sử dụng placeholders and bind values.

+1

'DBH-> bind()' là tương đương trực tiếp, nhưng giống như Sinan nói, đừng làm vậy. Làm điều đó đúng với các phần giữ chỗ và các giá trị liên kết. – mpeters

2

Từ 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

Đó là bài viết Randal Schwartz của "Tránh tấn công SQL Injection". Tốt đẹp. –

5

Giống như quote?

Tôi cũng khuyên bạn nên đọc tài liệu cho DBD::MySQL nếu bạn lo lắng về utf8.

9

Không. Bỏ trốn. SQL.

Không. Trích dẫn. SQL.

Sử dụng trình giữ chỗ/tham số SQL (?). Cấu trúc của câu lệnh SQL và các giá trị dữ liệu được trình bày bởi các trình giữ chỗ được gửi đến cơ sở dữ liệu hoàn toàn riêng biệt, do đó (chặn một lỗi trong cơ sở dữ liệu hoặc mô-đun DBD) hoàn toàn không có cách nào các giá trị dữ liệu có thể được hiểu là SQL lệnh.

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 

Là một lợi ích phụ, sử dụng trình giữ chỗ cũng hiệu quả hơn nếu bạn sử dụng lại câu lệnh SQL (chỉ cần chuẩn bị một lần) và không kém hiệu quả nếu bạn không (nếu bạn không gọi chuẩn bị một cách rõ ràng, nó vẫn được gọi ngầm trước khi truy vấn được thực hiện).

Các vấn đề liên quan