2009-12-12 44 views

Trả lời

8

Một truy vấn tham số cơ bản là một truy vấn mà tóm tắt đi tất cả các đầu vào. Điều này có một số tác dụng phụ tốt, như làm cho tất cả các đầu vào vô hại (ví dụ, không có tiêm độc hại có thể) và làm cho nó nhanh hơn khi được sử dụng nhiều lần, vì nó được phân tích cú pháp và biên dịch, vì vậy động cơ biết cách áp dụng đầu vào đã cho. Một ví dụ trong mysql tinh khiết là:

PREPARE qry FROM "INSERT INTO tbl VALUES (?)"; 

Tuyên bố hiện đang biên soạn và lưu trữ, và có thể được thực hiện lặp đi lặp lại mà không cần phải biên dịch lại và giải thích nó:

SET @var = "some input"; 
EXECUTE qry USING @var; 
SET @var = "some other input"; 
EXECUTE qry USING @var; 

Khi được sử dụng trong PHP, nó thường như này (rút ngắn):

$stmt = prepare('INSERT INTO tbl VALUES(?)'); 
execute($stmt, array("some input")); 
execute($stmt, array("some other input")); 
execute($stmt, array("some more input")); 
+0

tôi không hoàn toàn hiểu làm thế nào điều này dừng SQL injection. Tôi không nghi ngờ điều đó, nhưng bạn có thể giải thích thêm? –

+2

Vì truy vấn được biên dịch trước khi bất kỳ tham số nào được đưa vào nó. Vì vậy, ngay cả khi một tham số là '"; DELETE FROM stuff; 'hoặc một cái gì đó như thế, nó sẽ được chèn vào bất cứ nơi nào câu lệnh được biên dịch nói, như một chuỗi hoàn chỉnh. Nó không đi qua trình phân tích cú pháp, bởi vì câu lệnh chính Bạn có thể so sánh nó với 'eval()' như: 'eval (" new Class ($ data); ")'. Xem xét dữ liệu là '); delete_all_my_files ('. Precompiled statements cơ bản có nghĩa là bạn tránh "eval". –

4
PREPARE stmt_name FROM "SELECT name FROM Country WHERE code = ?"; 

SET @test_parm = "FIN"; 

EXECUTE stmt_name USING @test_parm; 

Nguồn: MySQL Dev: Prepared Statements