2010-06-30 31 views
6

Vì vậy, tôi đã tự hỏi rằng điều này là đủ để được an toàn mà người dùng sẽ không làm bất kỳ tiêm SQL và số lượng sẽ được chỉ và luôn luôn số nguyên? Hàm $ id trong hàm getArticle được liên kết với truy vấn SQL.Is (int) và is_int() có an toàn để bảo vệ chống lại việc tiêm SQL không?

<?php $id = (isset($_GET['id']) && is_int((int)$_GET['id'])) ? (int)$_GET['id'] : false ?> 
<?php $news = $class->getArticle($id) ?> 

Đến nay tôi đã thử nghiệm nó hoạt động tốt, nhưng vì tôi không hoàn toàn chắc chắn tôi thích hỏi bạn guyz! Ok, mọi người nói rằng các câu lệnh chuẩn bị sẽ thực hiện thủ thuật. Họ thực sự sẽ? Giống như, tôi có thể hoàn toàn chắc chắn rằng nếu ràng buộc param như số nguyên nó sẽ là số nguyên không có gì khác?

Cảm ơn trước!

+2

Tôi nghĩ rằng thử nghiệm cho 'is_int ((int) [ANYTHING])' sẽ luôn trả về 'true' và do đó thừa. Sử dụng 'is_numeric' để kiểm tra nếu một cái gì đó ** có thể được chuyển đổi thành ** một' int' và sau đó sử dụng '(int)' để thực hiện chuyển đổi. Hoặc để lại bước đầu tiên, vì (int) sẽ tạo một 'int' bằng 0 trên các giá trị không thể nhận ra. – MvanGeest

+0

hãy cẩn thận nếu tham số $ _GET của bạn xuất phát từ biểu mẫu | bool is_int (hỗn hợp $ var) | Tìm xem loại biến đã cho là số nguyên hay không. Lưu ý: Để kiểm tra nếu một biến là một số hoặc một chuỗi số (chẳng hạn như đầu vào biểu mẫu, mà luôn luôn là một chuỗi), bạn phải sử dụng is_numeric(). – Redlab

Trả lời

10

Bạn có thể chỉ cần gõ quăng để loại thích hợp:

$number = intval($_GET['id']); 
$string = mysql_real_escape_string(strval($_GET['str'])); 

Để chắc chắn rằng bạn sẽ có được những gì bạn đang mong đợi.

Giải pháp tốt hơn là sử dụng Prepared statements để tránh phun sql.

+0

Tham khảo: http://php.net/manual/en/function.mysql-real-escape-string.php –

+7

Đồng ý, tại sao không chỉ sử dụng * Các câu lệnh đã chuẩn bị * và quên kiểm tra tham số. –

+0

Vâng, như tôi đã nói sau này tôi liên kết các tham số với truy vấn sql, nhưng nó thực sự sẽ làm những gì nó phải làm gì? Ý tôi là: bind_param ('i', $ id); sẽ làm các trick? – Rihards

0

Tôi không thể nghĩ cách nào có thể được sử dụng cho SQL-Injection. Vì vậy, tôi sẽ nói nó đủ an toàn.

0

chỉ cần sử dụng:

$id=(int)@$_GET['id']; 

nếu $ _GET [ 'id'] không được thiết lập $ id sẽ là 0.
nếu bạn muốn kiểm tra nếu id được thiết lập một cách chính xác sử dụng:

if ($id=(int)@$_GET['id']){ 
    // 
} else { 
    //invalid id 
} 
5

Sử dụng câu lệnh đã chuẩn bị. Không có lý do gì để KHÔNG sử dụng chúng. Sau đó, bạn không cần phải hỏi "Điều này có đủ tốt không?"

+0

Nếu đầu vào được truyền tới một số, thì tôi biết nó là "đủ tốt". Và nếu nó dễ dàng hơn để bỏ qua các câu lệnh đã chuẩn bị (xây dựng các truy vấn với WHERE IN) hoặc thực hiện nhiều hơn (thực hiện một chuỗi lớn chèn trong một truy vấn) thì có những lý do không sử dụng chúng. –

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