Khi tham gia các bảng, tôi sử dụng các mô hình SQL của Khung công tác Zend. Ví dụ tôi đã sửa đổi mã thực tế của mình, nhưng tôi nghĩ bạn sẽ nhận được điểm:
$this->getSelect()->join(
array('sections' => $sectionsTableName),
'main_table.banner_id = pages.banner_id',
array()
)
->where("sections.section= '$section' OR sections.section = '0' OR (sections.section = '6' AND ? LIKE main_table.url)",$url)
->group('main_table.banner_id');
Trang được tải với ajax và tham số phần $ được gửi dưới dạng tham số GET ( www.example.com/controllerName/index/display/3?paremeter1=example§ion=www.example2.com
).
Bây giờ đây là vấn đề nếu ai đó thực hiện một cái gì đó như thế này:
www.example.com/controllerName/index/display/3?paremeter1=example&url=(SELECT 3630 FROM(SELECT COUNT(*),CONCAT(0x7170786a71,(SELECT (ELT(3630=3630,1))),0x717a716b71,FLOOR(RAND(0)*2))x FROM INFORMATION_SCHEMA.CHARACTER_SETS GROUP BY x)a)
Bằng cách này, người dùng có thể kết xuất toàn bộ cơ sở dữ liệu. Dữ liệu sẽ không được hiển thị, nhưng SQL vẫn sẽ thực hiện kết xuất có thể gây quá tải sql.
Câu hỏi:
- Cách tốt nhất để ngăn chặn kịch bản như vậy là gì?
- Bây giờ tôi lo lắng cho khách hàng trước. Là với mã này có thể thực hiện nhiều hành động rủi ro hơn, như delate hoặc thay đổi bảng? Tôi đoán không phải vì bạn không thể đặt bất kỳ câu lệnh nào khác ngoài CHỌN bên trong subselect để DELETE sẽ tạo ra lỗi cú pháp sql. Tôi có đúng không
CẬP NHẬT: Ví dụ của tôi không phải là minh họa thích hợp cho việc tiêm SQL vì có 'dấu hiệu arround $ và do đó sẽ không thể thực hiện tiêm. Dù sao, điều này sẽ có thể khi mong đợi giá trị số nguyên và khi bạn không lọc đầu vào số nguyên. Xem bình luận của tôi dưới đây.
'
dấu trước khi (
ký và do đó (SELECT
hoặc bất cứ thứ gì khác sẽ chỉ là chuỗi và không phải là hàm. Khi trường là số nguyên, thì '
không cần thiết và nó có thể xảy ra kịch bản như vậy. Nhưng số nguyên phải luôn được lọc với intval()
vì vậy đây cũng không phải là vấn đề.
'
? Vậy ' AND (SELECT ...) '
sao Nhân tiện, tôi không nghĩ Zend không trích dẫn điều này ... Và nếu bạn sử dụng các ràng buộc, thì PDO sẽ xử lý việc này. Chỉ cần không bao giờ sử dụng cách ghép nối như thế này:"sections.section= '$section'"
$db = Mage::getSingleton('core/resource')->getConnection('core_read');
và$db->quote()
thậm chí trong trường hợp của bạn nhìn vào$db->quoteInto
. Nếu$this
là một tài nguyên, bạn có thể làm:$this->getConnection('core_read')->quoteInto()
nếu đó là một bộ sưu tập bạn có thể làm :$this->getResource()->getConnection('core_read')->quoteInto()
. dọc theo những dòng đó. Nếu điều đó giúp hướng dẫn bạn hướng tới mục tiêu của bạn.