2011-08-31 38 views
19

Tóm tắt của mùa xuân JdbcTemplate cung cấp rất nhiều chức năng, nhưng nó có thể được sử dụng theo cách cung cấp bảo vệ khỏi các cuộc tấn công SQL injection không?Spring JDBC có cung cấp bất kỳ sự bảo vệ nào khỏi các cuộc tấn công SQL injection không?

Ví dụ: như loại bảo vệ bạn sẽ nhận được bằng cách sử dụng PreparedStatement với tham số được xác định chính xác.

Trả lời

23

Chắc chắn là vậy. Ví dụ này là trực tiếp từ mùa xuân 3,0 docs (nhưng là như nhau trong 2. *):

String lastName = this.jdbcTemplate.queryForObject( 
     "select last_name from t_actor where id = ?", 
     String.class, 1212L); 

Như bạn có thể thấy, nó mạnh ân chuẩn bị báo cáo (mà nó phải được sử dụng đằng sau hậu trường cho bạn): bạn chỉ định các tham số có phần giữ chỗ (?) và cung cấp một mảng đối tượng để điền vào các tham số. (Tham số cuối cùng là loại kết quả mong đợi nhưng không liên quan lắm đến câu hỏi này.)

Bạn cũng có thể sử dụng số NamedParameterJdbcTemplate và cung cấp các thông số trong Map, có lẽ kém hiệu quả hơn.

+1

Làm mát - điều chính là việc sử dụng các phương thức tham số trong API của Spring chắc chắn ánh xạ lên các phương thức được tham số hóa trong Java PreparedStatemes cơ bản theo cách bảo vệ được bảo toàn. – Brabster

+0

Họ nên làm; Tất cả về cách triển khai thực tiễn tốt nhất theo cách thuận tiện hơn và sử dụng PreparedStatement đã được thông báo cho ... tốt, tôi nhớ nó đã được thông báo trong phiên bản đầu tiên của JDBC mà tôi gặp lại trong Java 1.1, mặc dù khá là kén chọn. (Tôi không biết liệu tất cả các trình điều khiển JDBC có đúng không, nhưng nếu tôi không xem xét một lý do _excellent_ vì không sử dụng nó.) –

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