2011-08-02 26 views
6

Ai đó có thể giải thích nếu không bao gồm cfsqltype cho cfqueryparam vẫn hữu ích cho việc bảo vệ SQL injection không? Và cũng có những gì thực sự xảy ra với cfqueryparam với cfsqltype và w/o cfsqltype.Không bao gồm cfsqltype cho cfqueryparam vẫn hữu ích cho việc bảo vệ phun sql không?

<!--- without cfsqltype---> 
<cfqueryparam value="#someValue#"> 

<!--- with cfsqltype---> 
<cfqueryparam value="#someValue#" cfsqltype="cf_sql_char"> 
+0

Ý của bạn là "vẫn hữu ích"? Nó có hữu ích trước đây không? –

+1

Tôi đoán tôi có nghĩa là từ tất cả các tài liệu tôi đọc cfsqltype luôn luôn có mặt trong một cfqueryparam nhưng nó không phải là một thuộc tính cần thiết. Tôi nghĩ rằng nó là hữu ích nhưng là "xác nhận" không "bảo vệ tiêm truy vấn sql". Tôi muốn một số ý kiến ​​peeps kiến ​​thức nhiều hơn như chính mình. –

+0

Tôi nghĩ bạn nên cập nhật câu hỏi của mình để cung cấp ví dụ: webRat

Trả lời

11

Để có được một ý tưởng tốt về những gì cfsqltype được likley làm dưới mui xe có một cái nhìn tại các lớp Java/JDBC PreparedStatement: http://download.oracle.com/javase/6/docs/api/java/sql/PreparedStatement.html

Bạn sẽ nhận thấy setInt khác nhau, setDate, phương pháp vv - hiểu biết của tôi là cfsqltype được so khớp với một phương thức tương ứng khi nó tạo câu lệnh đã chuẩn bị.

Nếu bạn chỉ định một loại thì ColdFusion cần có khả năng truyền biến thể vào loại đó và nếu không, nó sẽ ném một ngoại lệ trước khi gửi truy vấn đến cơ sở dữ liệu.

Khi bạn bỏ qua cfsqltype, nó có thể gọi là setObject hoặc setString. Hành vi của những gì xảy ra tiếp theo phụ thuộc vào trình điều khiển JDBC bạn đang sử dụng tại thời điểm này. Tôi đã nhìn thấy một số trường hợp bỏ qua các loại có thể gây ra một lỗi ngay cả khi bạn đang đi qua trong các biến hợp lệ, một trong đó đến với tâm là làm việc với ngày và datetime trên MySQL. Một điều nữa cần lưu ý là nếu bạn bỏ qua cfsqltype trên giả sử một trường số nguyên, nhưng bạn vượt qua một giá trị không nguyên, ColdFusion có thể đã ném ngoại lệ trước khi kết nối với cơ sở dữ liệu và gửi truy vấn nếu bạn chỉ định cfsqltype , nhưng không có nó, bạn lãng phí kết nối DB và thời gian thực hiện trên máy chủ cơ sở dữ liệu.

2

Một trong những lợi ích của cfqueryparam là kiểm tra kiểu trước khi các giá trị được gửi đến cơ sở dữ liệu của bạn. Ví dụ: bạn chỉ định cf_sql_integer, CF không chỉ xác minh giá trị là số, mà còn là số nguyên trong một phạm vi cụ thể. Khi bạn bỏ qua cfsqltype, CF sẽ sử dụng cf_sql_char. Vì vậy, bạn rõ ràng là mất kiểm tra loại cho những thứ như ngày tháng và số.

Cá nhân, tôi nghĩ bạn nên cung cấp cfsqltype. Tuy nhiên, ngay cả khi bạn không sử dụng cfqueryparam nghĩa là CF sử dụng các biến liên kết. Một lợi ích phụ của các biến liên kết là giúp bảo vệ các truy vấn của bạn chống lại tiêm sql. Vì vậy, theo nghĩa đó, nó vẫn là một điều tốt.

Tôi nghĩ nó hữu ích nhưng "xác thực" không phải "truy vấn sql tiêm bảo vệ".

Cập nhật: Không, nó vẫn được áp dụng. Việc bảo vệ đến từ việc sử dụng các biến liên kết. Vì CF vẫn sẽ sử dụng các biến liên kết, thậm chí không có một loại, tôi tin rằng việc bảo vệ tiêm sql cơ bản vẫn được áp dụng.

Điều đó nói rằng, sử dụng cf_sql_char trên một mục nào đó không phải là cột char có thể buộc cơ sở dữ liệu của bạn thực hiện chuyển đổi tiềm ẩn cho loại dữ liệu của cột mục tiêu, đôi khi tạo ra kết quả không mong muốn. Vì vậy, nói chung tôi sẽ nói bạn nên chỉ định một cfsqltype.

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