2011-03-13 23 views
9

Làm thế nào để kiểm tra với phpunit ứng dụng web php cho xss + sql injection? Tôi nghĩ rằng để tìm chương trình mà đầu ra xss + các cuộc tấn công khác để kiểm tra các hình thức ứng dụng của tôi. Chương trình/dịch vụ này phải được cập nhật tất cả thời gian với các lần tấn công mới và xss mới. Dịch vụ/chương trình đó có tồn tại không, nếu không phải như thế nào? Vui lòng cung cấp một số ví dụ nếu bạn có thể.Làm thế nào để kiểm tra với phpunit để tiêm xss + sql?

(tôi sử dụng php 5.3 + framework zend + mysql)


Edit:

tôi hỏi về thử nghiệm và không ngăn cản kỹ thuật mà tôi cũng biết!.

Cảm ơn,

Yosef

+2

Không chắc chắn đây có phải là trường hợp cho Kiểm tra đơn vị hay không ... Quan tâm để xem câu trả lời nào xuất hiện. –

+0

Tôi bị cám dỗ trả lời, 'Viết kịch bản tìm kiếm' (SELECT | INSERT | UPDATE). * \ $ \ W +. * ", Nếu có, mã của bạn đã thất bại.' – cwallenpoole

+0

Tôi đồng ý, đây không phải là về thử nghiệm đơn vị, đây là về việc đảm bảo rằng mã của bạn chỉ sử dụng các câu lệnh đã chuẩn bị. Sử dụng hệ thống PDO, và sau đó liên kết các biến thông qua hệ thống đó. – cwallenpoole

Trả lời

9

Tôi không nghĩ rằng bạn có thể dễ dàng làm các unit test cho loại điều. Nó sẽ yêu cầu ứng dụng của bạn được viết theo cách có lợi cho việc chế nhạo các bộ phận thành phần của nó và chắc chắn liên quan đến công việc thủ công liên tục (đảm bảo có kiểm tra và mocks cho mọi thứ, kiểm tra vô số các cuộc tấn công, v.v.).

Điều duy nhất nhất định là nếu bạn có thể nhận được một số công cụ tự động phạm vi rộng luôn được cập nhật, bất kỳ ai đã đưa nó cho bạn không tính phí đủ.

Các hình thức bảo vệ chống lại các cuộc tấn công đó đều khá nổi tiếng và dễ dàng để sử dụng:

  • Luôn escape variables in sql, hoặc tốt hơn là sử dụng prepared statements
  • Nếu bạn không cần để chấp nhận và duy trì đầu vào HTML , luôn luôn htmlspecialchars bất kỳ biến nào đi vào HTML (lưu ý rằng có nhiều định dạng như BBCode, MarkDown, Textile v.v. với mục đích duy nhất là cho phép một tập con tùy chọn định dạng hữu ích mà không cần mở hộp Pandora)
  • Nếu bạn hoàn toàn, chắc chắn nhất cần chấp nhận, lưu trữ và phục vụ dữ liệu HTML sau đó có HTMLPurifier có thể giúp - nhưng làm điều đó chỉ như là một phương sách cuối cùng

Vì vậy, tôi muốn nói rằng đó là giá trị tốt hơn nhiều cho thời gian của bạn để đảm bảo rằng bạn làm theo những thực hành này/sử dụng những công cụ này. Ngoài ra, nếu bạn phễu tất cả quyền truy cập vào hai hệ thống con này (đầu ra sql và HTML) thông qua một phần được xác định rõ ràng của ứng dụng của bạn (các phương thức truy cập cơ sở dữ liệu thoát khỏi tất cả đầu vào bất kể điều gì; các biến đầu vào thoát và đưa chúng vào một "mẫu HTML" được cung cấp mà bạn sau đó lặp lại) sau đó nó trở nên dễ dàng để kiểm tra đơn vị các hệ thống con này. Các khung công tác PHP đã quyết định đã làm điều này.

Tại thời điểm này, cơ hội duy nhất thực sự giới thiệu lỗ hổng là bằng cách tránh hoặc lạm dụng các hệ thống con này. Theo ý kiến ​​của tôi, bạn nên cố gắng chi tiêu và thực hiện các quy trình viết mã tốt để viết các bài kiểm tra đơn vị để ngăn ngừa các lỗ hổng trong logic nghiệp vụ của bạn (các bài kiểm tra đơn vị cho mã vệ sinh của bạn dĩ nhiên là hoàn toàn khác).

Cuối cùng, có automatedSQLinjectiontoolsXSS-relatedtools mà bạn có thể sử dụng để thăm dò các ứng dụng web. Nhưng trừ khi ai đó thuê bạn để làm thử nghiệm thâm nhập, tốt hơn là sử dụng chúng như bạn sẽ sử dụng bảo vệ trong giới tính: sử dụng nó, nhưng không tin vào nó.

+1

Downvoter: Hãy giúp tôi cải thiện câu trả lời nếu bạn thấy nó thiếu. Cảm ơn bạn. – Jon

5

Tiêm SQL là một trong những loại vấn đề chỉ có thể thực sự được tìm thấy bằng cách kiểm tra mã của bạn. Bạn nên tìm kiếm những nơi bạn đang xây dựng các truy vấn động hơn là sử dụng các câu lệnh đã chuẩn bị - đó là các vectơ tiêm SQL của bạn. Thay đổi chúng thành các câu lệnh đã chuẩn bị và bạn loại bỏ nguy cơ tiêm SQL.

Kiểm tra đơn vị sẽ giúp bạn với các lỗi logic, nhưng sẽ không giúp bạn tìm ra các vấn đề bảo mật như vậy. Các giải pháp duy nhất là cảnh giác và đánh giá/kiểm tra mã.

CẬP NHẬT: Tôi gần như đã quên! Bạn nên kiểm tra PHP_CodeSniffer để thực hiện kiểm tra tự động mã của bạn. Nó sẽ giúp bạn phát hiện ít nhất một số trường hợp nơi mọi người đang làm những thứ nguy hiểm và không an toàn trong mã và bạn có thể mở rộng nó để phát hiện nhiều sự cố hơn cài đặt cơ bản theo mặc định.

+0

+1 để kiểm tra mã là giải pháp tốt nhất. Nhưng các phát biểu đã chuẩn bị không phải là bằng chứng chống lại tất cả các trường hợp tiêm SQL. –

+0

Tôi hơi bối rối vì điều đó. Tôi đang làm việc với giả định rằng nếu ai đó sử dụng các câu lệnh chuẩn bị, họ cũng (a) kiểm tra người dùng có quyền truy cập vào bản ghi đang được chọn/chèn/cập nhật/xóa và (b) các câu lệnh đó không được xây dựng động . Tôi không thể nghĩ ra bất kỳ vector vectơ SQL rõ ràng nào khác có thể với các câu lệnh đã chuẩn bị. Có khả năng máy chủ lưu trữ bộ nhớ đệm tối ưu hóa các kế hoạch thực hiện tối ưu, nhưng đó thực sự là một vấn đề riêng biệt. Đối với sự tò mò của riêng tôi, có thể xây dựng trên các vectơ tiêm khác chuẩn bị báo cáo sẽ không bao gồm? –

+0

@Keith: Các tham số truy vấn có thể được sử dụng thay cho giá trị SQL theo nghĩa đen và chỉ một giá trị một. Mọi người vẫn cần phải thực hiện các phần khác của một truy vấn động, ví dụ như tên bảng, tên cột, từ khóa SQL, danh sách các giá trị trong mệnh đề 'IN()' hoặc các biểu thức khác. Bạn không thể sử dụng tham số truy vấn cho những trường hợp đó, vì vậy bạn phải xây dựng chuỗi truy vấn SQL với logic ứng dụng trước khi chuẩn bị truy vấn đối với RDBMS. –

6

Tôi sẽ không viết các bài kiểm tra đơn vị để phát hiện XSS hoặc SQL injection. gì tôi sẽ làm là:

Để ngăn ngừa XSS, thoát khỏi tất cả các đầu ra người dùng với một trong số:

Để tránh SQL Injection, hãy sử dụng PDO và trình giữ chỗ cho mọi thứ. tức)

"SELECT * FROM users WHERE uid = $_POST['id']"; 

trở thành

"SELECT * FROM users WHERE uid = ?"; 

hoặc

"SELECT * FROM users WHERE uid = :id"; 

Sửa Bạn cũng có thể muốn thử một số addons trình duyệt như:
https://addons.mozilla.org/en-US/firefox/addon/hackbar/
https://addons.mozilla.org/en-US/firefox/addon/xss-me/
https://addons.mozilla.org/en-US/firefox/addon/sql-inject-me/
https://addons.mozilla.org/en-US/firefox/addon/access-me/

+0

Tôi biết cách ngăn chặn, tôi hỏi về thử nghiệm – Yosef

+0

@Yosef Bạn có thể muốn thử tiện ích mở rộng của trình duyệt để kiểm tra các lỗ hổng bảo mật. –

+0

Cảm ơn, tiện ích mở rộng này có yêu cầu thử nghiệm chèn thủ công không? Vì điều này không giải quyết được sự cố – Yosef

1

Lấy XSS Me add-on cho firefox và chạy nó chống lại các trang của bạn để kiểm tra.

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