2010-07-08 28 views
7

Tôi có một ứng dụng nhận dữ liệu qua yêu cầu POST. Tôi đang sử dụng dữ liệu này để chèn một hàng mới vào cơ sở dữ liệu. Tôi biết rằng bằng cách sử dụng mysql_real_escape_string() (cộng với loại bỏ% và _) là cách để đi cho chuỗi, nhưng những gì về giá trị số nguyên? Ngay bây giờ, tôi đang sử dụng hàm PHP intval() trên chúng.Vệ sinh đầu vào cơ sở dữ liệu số nguyên

Tuy nhiên, tôi muốn đảm bảo rằng intval() hoàn toàn an toàn. Tôi không thể nhìn thấy một cách của kẻ tấn công tạo ra một cuộc tấn công SQL injection khi các biến được chạy qua intval() đầu tiên (vì nó luôn trả về một số nguyên), nhưng tôi muốn đảm bảo đây là trường hợp từ những người có nhiều kinh nghiệm hơn tôi .

Cảm ơn.

+0

Cảnh báo: Nếu bạn đang xử lý các số lớn hơn 32 hoặc 64 bit (tùy thuộc vào nền tảng của bạn) 'intval()' sẽ trả về 0. Điều này rõ ràng là không mong muốn nếu bạn đang cố gắng để lưu trữ số lượng rất lớn trong cơ sở dữ liệu của bạn. Ví dụ: id của facebook không phù hợp với 32 bit trong nhiều năm http://developers.facebook.com/blog/post/45 –

+0

@Frank Nông dân: Hm .. điều đó thật thú vị. Cảm ơn cho những người đứng đầu lên. Tôi sẽ xem xét những gì chúng ta có thể làm để giải quyết vấn đề đó, nếu cần thiết. –

Trả lời

21

Có, intval() là an toàn. Có hoàn toàn không có cách nào để thực hiện một SQL injection khi tham số được chuyển đổi sang số nguyên, bởi vì (rõ ràng) định dạng của một số nguyên không cho phép đặt các từ khóa SQL (hoặc dấu ngoặc kép, hoặc bất cứ điều gì) trong đó.

+0

Được rồi, đó là những gì tôi nghĩ. Cảm ơn bạn. –

+4

Bạn cũng có thể sử dụng '(int) $ id' vì việc đúc nhanh hơn nhiều so với sử dụng hàm' intval ($ id) '. Kiểm tra: http://hakre.wordpress.com/2010/05/13/php-casting-vs-intval/ – DaFrenk

+0

Bạn có chắc chắn không? Nguyên nhân intval là rất nhiều permissive về những gì nó cần như là một tham số đầu vào. Mã này tạo ra kết quả số nguyên chính xác nhưng tôi sẽ không bao giờ muốn các giá trị như vậy bên trong các truy vấn của tôi: '$ var =" 123TYPE_JUGGLING "; var_dump (is_numeric ($ var)); var_dump ((int) $ var); var_dump (intval ($ var)); ' –

4

Cách dễ nhất để ngăn chặn việc tiêm SQL là luôn sử dụng các số liệu đã chuẩn bị. Sử dụng các thư viện mysqli hoặc tốt hơn là một ORM như học thuyết, vv

truy vấn của bạn sau đó trở thành một cái gì đó như:

$stmt = $db->prep_stmt("select * from .... where userid = ? and username = ?"); 

/* Binding 2 parameters. */ 
$stmt->bind_param("is", $userid, $username); 

$userid = 15; 
$username = "don"; 

/* Executing the statement */ 
$stmt->execute() or die ("Could not execute statement"); 
+2

+1 cho báo cáo đã chuẩn bị. Tuy nhiên, tôi vẫn xác nhận hợp lệ dữ liệu người dùng nhập vào trước khi thực hiện chèn để tránh một ngoại lệ SQL. Trừ khi, tất nhiên, ORM hoặc khung làm việc đó cho tôi. –

+0

Thật không may, báo cáo chuẩn bị không có sẵn cho dự án cụ thể này. –

2

tôi luôn luôn làm

$var = (int)$_POST['var']; 

để đảm bảo $ var được xử lý như một số nguyên trong mọi trường hợp và không bao giờ xem lại $ _POST ['var']. Nhìn vào hướng dẫn sử dụng, intval() thực hiện giống hệt nhau.

Bất kỳ cách nào bạn đi, trong chuỗi $ var sẽ là một số nguyên thực, khá an toàn để xử lý.

2

Statared được chuẩn bị là cách tốt nhất để xử lý việc chèn sql. hoặc sử dụng PDO nếu không, intval tốt hơn is_numeric

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