2010-06-01 29 views
5

Đây có thể là một câu hỏi ngu ngốc. Hoặc có thể kỹ năng hack của tôi bị hạn chế (tôi không thực hành chúng chút nào).Các truy vấn multiline sql-injection có an toàn không?

Tôi có một truy vấn mà trông như thế này:

<?php 
$query =<<<eot 
    SELECT  table_x.field1, 
       table_x.field2, 
       table_y.*, 
       table_z.field4 
    FROM  (
        SELECT ... 
       ) as table_y 
    LEFT JOIN table_x 
    ON   table_x.field1 = table_y.field_x 
    LEFT JOIN table_z 
    ON   table_z.field1 = table_y.field_z 
    WHERE  table_x.field3 = '$something' 
    AND   table_z.field4 = '1' 
    AND   table_z.field5 = '2' 
eot; 
?> 

Tôi có rất nhiều thử nghiệm khác trên $something trước khi nó được sử dụng, như $something = explode(' ',$something); (mà sau này dẫn đến một chuỗi) ai trong số họ có ý định ngăn chặn tiêm nhưng họ làm cho nó khó khăn cho tiêm nhất định để có được như là để truy vấn thực tế. Tuy nhiên, có nhiều cách. Chúng ta đều biết cách thay thế một không gian cho một thứ gì đó khác vẫn còn hiệu lực ..

Vì vậy, nó không thực sự là một vấn đề để tạo ra một đoạn SQL có khả năng gây hại mà $something ... Nhưng có cách để bình luận phần còn lại của chuỗi truy vấn ban đầu nếu nó là nhiều dòng?

tôi có thể bình luận AND table_z.field4 = '1' sử dụng ;-- nhưng không thể bình luận như sau AND table_z.field5 = '2'

Có thể mở một đa dòng chú thích /* mà không đóng nó hoặc một cái gì đó trông giống như và do đó cho phép tiêm để bỏ qua sự đa truy vấn dòng?

Trả lời

4

Nó không an toàn. Ngay cả khi nó không thể nhận xét phần còn lại, nó có thể tiền tố nó với SELECT * FROM my_table WHERE 1 = 1.

+0

Cảm ơn Adam, bạn nói đúng. Thật dễ dàng để hack truy vấn nhiều dòng này. Xấu hổ với tôi vì không thấy tùy chọn đó. Đây là một ví dụ và tình huống của tôi phức tạp hơn một chút. Vì tôi không giải thích được, tôi sẽ chấp nhận câu trả lời của bạn là chính xác. – acm

5
$something = "'; DROP TABLE table_x; SELECT * FROM table_z WHERE '1' = '1"; 
2

Sử dụng báo cáo chuẩn bị để được an toàn:

http://www.php.net/manual/en/pdo.prepare.php

Chuỗi suy luôn luôn có nguy cơ tiêm mã nếu đầu vào của bạn là không được làm sạch đầy đủ.

Xóa khả năng thực thi mã tùy ý là cách dễ dàng hơn và an toàn hơn nhiều.

+0

+1 Đây thực sự là câu trả lời đúng. "Làm sạch" bản thân bạn chỉ là tốt như kiến ​​thức của bạn về SQL injection. Hãy để cơ sở dữ liệu/thử nghiệm ORM xử lý nó cho bạn. – richsage

2

@Techpriester: đó không phải là tuyên bố chuẩn bị.

http://dev.mysql.com/tech-resources/articles/4.1/prepared-statements.html (phiên bản cũ, điều tương tự)

PDO là một lớp trừu tượng cơ sở dữ liệu "chuẩn bị báo cáo", nhưng một tuyên bố chuẩn bị là một cái gì đó hoàn toàn khác nhau!

+1

PDO mô phỏng các câu lệnh đã chuẩn bị theo mặc định, nhưng bạn có thể tắt chế độ này '$ pdo-> setAttribute (PDO :: ATTR_EMULATE_PREPARES, false);' Xem nhật ký truy vấn MySQL chung của bạn và xem nó hoạt động! –

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