2012-01-16 14 views
5

Nhóm của chúng tôi đang tìm cách tuân thủ tốt hơn các nguyên tắc OWASP và một trong các nhiệm vụ là phòng ngừa các cuộc tấn công SQL Injection. Để tạo thuận lợi cho điều này, tôi đã tìm kiếm một cách để tự động kiểm tra việc sử dụng java.sql.Statement trong codebase của chúng tôi, vì vậy điều này có thể được gắn cờ và thay đổi để sử dụng PreparedStatement.Tìm cách ngăn chặn việc sử dụng java.sql.Statement trong dự án

Quá trình xây dựng của chúng tôi dựa trên Maven và chúng tôi cũng có cài đặt Sonar để chạy phân tích trên dự án. Một số quy tắc đã được đưa ra tại Sonar để không xây dựng được nếu các ngưỡng nhất định được đáp ứng, vì vậy điều này có thể được thực hiện ở đó. Tôi đã nhìn thấy nơi tôi có thể thiết lập một quy tắc regex kiểm tra kiểu tìm kiếm nhập khẩu, nhưng tôi muốn xem nếu có các tùy chọn khác là tốt.

Bất kỳ vị trí nào dọc theo đường dẫn xây dựng/phát triển sẽ hoạt động. Nếu có thứ gì đó trong intellij có thể gắn cờ cái này, cái gì đó trong quá trình xây dựng maven, hay một cách khác để gắn cờ cái này ở Sonar, bất kỳ cái nào trong số này cũng sẽ ổn thôi.

Cảm ơn !!

+0

Lưu ý rằng các cuộc tấn công tiêm tương tự cũng có thể được thực hiện với các câu lệnh đã chuẩn bị: 'connection.prepareStatement (" select t1. * From t1 where t1.code = '"+ code +"' ");'. Điều tốt nhất là giáo dục các nhà phát triển. –

+0

Chúng tôi sẽ thực hiện kiểm tra OWASP và họ sẽ tìm kiếm thêm các vật phẩm cụ thể. Tôi đồng ý với tuyên bố của bạn về điều này, nhưng chúng tôi cũng muốn một số loại kiểm tra tự động. – jaycyn94

Trả lời

7

Tôi sẽ đề xuất creating an architectural constraint trong Sonar.

Ví dụ minh họa quy tắc cấm sử dụng các lớp * java.sql. **.

+0

Đó chính xác là những gì tôi đang tìm kiếm. Bằng cách nào đó tôi đã bỏ qua quy tắc đó ở Sonar. Cảm ơn! Làm việc như một nhà vô địch. – jaycyn94

1

Tôi chưa sử dụng, nhưng PMD có vẻ như đây có thể là công cụ tốt cho việc này.

+0

SONAR tổng hợp các báo cáo từ PMD, CheckStyle, FindBugs và các số liệu khác. Có một cơ hội tốt mà PMD đã được sử dụng là SONAR được sử dụng. –

+0

Tôi chưa thấy bất kỳ quy tắc PMD nào sẽ kiểm tra trực tiếp điều này, vì vậy nó rơi vào cùng một nhóm với [CheckStyle] (http://checkstyle.sourceforge.net/) bằng cách tạo quy tắc tùy chỉnh để kiểm tra. Cảm ơn! – jaycyn94

+0

Và đến @JBNizet điểm, chúng tôi đã chạy các ruleset PMD trên mã. – jaycyn94

0

Thay vì phát hiện mức sử dụng lớp học, thay vào đó bạn có thể phát hiện thế hệ của mình bằng proxy java.sql.Connection không? Khi bạn nhận được kết nối của bạn từ nhà máy, bạn sẽ quấn nó trong proxy của bạn. Proxy của bạn sẽ được thiết kế để có thể thực hiện các cuộc gọi, đăng nhập chuỗi truy vấn và/hoặc báo cáo về dấu vết ngăn xếp khi mọi người đang sử dụng createStatement() hoặc các cuộc gọi không giới hạn khác.

public class ProxyConnection implements Connection { 
    private Connection realConnection; 

    public ProxyConnection(Connection realConnection) { 
     this.realConnection = realConnection; 
    } 

    public Statement createStatement() throws SQLException { 
     // could the offenders 
     createCounter.incrementAndGet(); 
     // log the callers -- expensive so maybe every 100th or every 10 secs 
     logger.info("call to createStatment", new Exception("createStatement")); 
     // maybe just throw 
     if (throwOnBadCall) { 
      throw new SQLException("calls to createStatement aren't allowed")); 
     } 
     return realConnection.createStatement(); 
    } 

Nếu bạn không muốn nhận quá nặng trong sản xuất sau đó bạn luôn luôn có thể đếm chúng và có một loại volatile boolean logBadCall của lá cờ để chỉ cho phép việc kiểm tra cho một khoảng thời gian để nếm thử tìm kiếm các vấn đề. Có thể ban đầu bạn làm một số lấy mẫu, tấn công 80% vị trí và sau đó chỉ phát hiện vĩnh viễn khi bạn đã quan tâm đến các phần tải truy vấn cao trong ứng dụng của mình.

Nếu bạn không có vị trí trung tâm để bọc kết nối thì bạn có thể phải quấn hồ bơi kết nối hoặc nhà máy lên chuỗi một chút.

Hy vọng điều này sẽ hữu ích.

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