Đối tác của tôi trên một dự án PHP phản đối thực hành của tôi về việc luôn luôn khử trùng các giá trị số nguyên trong SQL động. Chúng tôi sử dụng các truy vấn được tham số hóa khi có thể. Nhưng đối với các điều kiện UPDATE và DELETE Zend_Db_Adapter
yêu cầu một chuỗi SQL không tham số. Đó là lý do tại sao tôi, thậm chí không suy nghĩ, luôn luôn viết một cái gì đó như:Có thể cho phép đôi khi SQL động mà không cần vệ sinh không?
$db->delete('table_foo', 'id = ' . intval($obj->get_id()));
Đó là tương đương, nhưng là một phiên bản ngắn hơn (Tôi đã kiểm tra mã nguồn ZF):
$db->delete('table_foo', $db->qouteInto('id = ?', $obj->get_id(), 'INTEGER'));
đối tác của tôi mạnh đối tượng này intval()
, nói rằng nếu $obj
ID là null (đối tượng chưa được lưu vào DB), tôi sẽ không nhận thấy lỗi, và hoạt động DB sẽ chỉ im lặng thực hiện. Đó là những gì đã thực sự xảy ra với anh ta.
Ông ấy nói rằng nếu chúng tôi khử trùng tất cả các biểu mẫu HTML, không có cách nào ID nguyên có thể xâm nhập vào '; DROP TABLE ...'
hoặc ' OR 1 = 1
'hoặc giá trị khó chịu khác và được chèn vào truy vấn SQL của chúng tôi. Vì vậy, tôi chỉ hoang tưởng, và làm cho cuộc sống của chúng ta không cần thiết phức tạp hơn. "Ngừng tin tưởng vào các giá trị $_SESSION
sau đó", ông nói.
Tuy nhiên, với điều kiện giá trị chuỗi ông không đồng ý với:
$db->update->(
'table_foo',
$columns,
'string_column_bar = ' . $db->qoute($string_value))
);
Tôi thất bại trong việc chứng minh anh ta sai, và ông thất bại trong việc chứng minh tôi sai. Bạn có thể làm được không?
Báo cáo tham số! Các câu lệnh tham số! Các câu lệnh tham số! http://stackoverflow.com/questions/60174/best-way-to-stop-sql-injection-in-php – Cheekysoft
@Cheekysoft Thưa ngài, bạn đã đọc kỹ câu hỏi chưa? Chúng tôi sử dụng các câu lệnh được tham số hóa. Gửi thần chú của bạn đến Zend :) –
Wow! Có vẻ như bạn có thể liên kết trong xóa và cập nhật: http://stackoverflow.com/questions/1845153/zend-framework-how-to-delete-a-table-row-where-multiple-things-are-true –