2009-09-08 64 views
8

Chúng ta đều biết rằng SQL tham số là cách để đi khi giao dịch với đầu vào của người dùng và SQL động, nhưng được đúc từ chuỗi thành int (hoặc kép, hoặc dài hoặc bất kỳ) hiệu quả nếu đầu vào bạn đang tìm kiếm là số?Bảo vệ Tiêm SQL - Truyền từ chuỗi đến int

Tôi đoán những gì tôi đang hỏi là nếu kỹ thuật này một mình là không thể sai lầm liên quan đến SQL injection?

Trả lời

10

Tôi không có chuyên gia, nhưng tôi chắc chắn rằng điều này sẽ an toàn.

Nhưng tại sao lại có cơ hội? Sử dụng tham số SQL và bạn không bao giờ cần phải lo lắng về nó.

Bên cạnh đó, việc tham số hóa SQL của bạn có những ưu điểm khác, không chỉ bảo vệ chống tiêm.

1

An toàn của nó liên quan đến phòng ngừa tiêm sql nhưng không thực sự là một ý tưởng tốt khi bạn nhận được một ngoại lệ, mà bạn luôn luôn muốn tránh nếu có thể như trường hợp ngoại lệ là tốn kém. Bạn thực sự nên khử trùng đầu vào. Và tất nhiên người dùng vẫn có thể thay đổi giá trị thành bất kỳ phạm vi nào trong một giá trị int32.

2

Nếu chuỗi là một số hợp lệ trước khi bạn đúc nó thành số nguyên thì có thể an toàn. Nhưng bạn phải chắc chắn rằng nó là một số nguyên hợp lệ trước khi đúc nó vào int.

Tôi không biết ngôn ngữ phía máy chủ nào bạn đang sử dụng nhưng trong PHP bạn có thể sử dụng hàm is_numeric(). Ví dụ:

$strYouExpectToBeInt = $_POST['id']; 
try { 
    if (false === is_numeric($strYouExpectToBeInt)) { 
     throw new Exception('id is not a numeric string or a number'); 
    } 
    $strYouExpectToBeInt = (int)$strYouExpectToBeInt; 
    if (false === is_int($strYouExpectToBeInt)) { 
     throw new Exception('id is not a valid integer'); 
    } 

    // everything is ok, you can use $strYouExpectToBeInt 
    // in SQL query now 

} catch (Exception $e) { 
    echo $e->getMessage(); 
} 
+0

Dude, tại sao bạn sử dụng hằng số ở bên trái? – arthurprs

1

Có thể là, nhưng đáng thử nghiệm.

Về câu trả lời của Richard, đôi khi tôi gặp rắc rối với IsNumeric() tự do hơn một chút so với số lượng hợp lệ so với CAST thực tế (tùy thuộc vào cài đặt bản địa hóa). Các nội dung như "-0", "3E-5", "5.000.000" đôi khi thỏa mãn IsNumeric, nhưng không truyền đúng cách. Vì vậy, tôi thường làm một thử đầy đủ, bắt xung quanh tuyên bố diễn viên thực tế thay thế.

+0

Vâng đó là lý do tại sao tôi cũng sử dụng is_int() sau khi đúc để đảm bảo. –

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