2011-08-18 16 views
5

Tôi đang sử dụng ColdFusion 9 và jQuery.ColdFusion CFC có an toàn khi truy cập từ xa không?

Tôi mới sử dụng Coldfusion CFCs thông qua CFAJAXPROXY. Tôi tò mò muốn biết liệu cơ sở dữ liệu của tôi có gặp rủi ro hay không và cách tôi có thể dễ dàng vá lỗ hổng bảo mật.

tôi đặt này ở phía trên cùng của trang:

<cfajaxproxy cfc="brands" jsclassname="jsApp"> 

Dưới đây là một CFC được sử dụng sau khi một số bản ghi trong:

<!--- ADD BRAND ---> 
<cffunction name="addBrand" access="remote"> 
    <cfargument name="SiteID" required="true"> 
    <cfargument name="Brand" required="true"> 
    <cfscript> 
     LOCAL.SiteID = ARGUMENTS.SiteID; 
     LOCAL.Brand = trim(left(ARGUMENTS.Brand, 50)); 
    </cfscript> 
    <cfquery name="GetBrands"> 
     INSERT INTO Brands(SiteID, Brand) 
     VALUES  (<cfqueryparam cfsqltype="cf_sql_integer" value="#LOCAL.SiteID#">, 
        <cfqueryparam cfsqltype="cf_sql_varchar" value="#LOCAL.Brand#">) 
    </cfquery> 
    <cfreturn true> 
</cffunction> 

Đây là jQuery rằng sẽ gửi dữ liệu đến CFC

$("#AddBrand").click(function() { 
    NewBrand = $("#NewBrand").attr("value"); 
    var jro = new jsApp(); 
    jro.addBrand(NewBrand); 
}); 

Vì vậy, có lỗ hổng bảo mật lớn ở đây không? Nên truy cập = "từ xa" được sử dụng chỉ để lấy dữ liệu?

+0

thay vì hai dòng cfscript, cách ''? :) – Henry

Trả lời

5

Không, truy cập = 'từ xa' không cần được sử dụng chỉ để truy xuất dữ liệu, nhưng nó cần phải được sử dụng cẩn thận và với sự hiểu biết về các tác động bảo mật.

Cách bạn đã đặt ngay bây giờ, bất kỳ ai cũng có thể thực hiện cuộc gọi để chèn nội dung nào đó vào DB của bạn (giả sử không có các điều khiển truy cập khác mà chúng tôi không nhìn thấy). Vì vậy, bạn có thể nên thực hiện một số loại điều khiển truy cập để bảo vệ chức năng này và các chức năng khác.

Bây giờ tôi sẽ giả định rằng bạn đã không đặt từ "dễ dàng" trong câu hỏi của bạn và tôi sẽ đặt trong từ "thực tế" để thay thế. Khi nói đến an ninh, hiếm khi có một "dễ dàng".

Vì vậy, có một số cách bạn có thể bảo vệ các phương pháp này. Rất nhiều phụ thuộc vào cách bạn muốn làm điều đó và những gì bạn đang làm.

  1. Nếu bạn đang sử dụng <cflogin> bạn có thể thêm roles="<Your Admin role name>" đến chức năng. Tôi chưa bao giờ thử điều này, nhưng tôi nghi ngờ nó sẽ hoạt động. (Cá nhân, tôi không thích phương pháp này vì nhiều lý do, nhưng đó là một tùy chọn)

  2. Bạn có thể đặt một số loại mã ủy quyền ở trên cùng của hàm.

<cfif NOT mySecurityCFC.isAuthorized(COOKIE.CFID,COOKIE.CFTOKEN)><cfreturn /></cfif>

tôi không thích phương pháp này một trong hai.

  1. Bạn có thể sử dụng phương pháp onCFCRequest() mới của App.cfc trong ColdFusion 9 để đánh chặn các yêu cầu và chạy chúng thông qua thói quen cho phép của bạn. Điều này là sạch hơn so với tùy chọn 2. Tôi sẽ nói đây là lựa chọn dễ dàng nhất, và sẽ hoạt động hiệu quả, nhưng cá nhân tôi thích tùy chọn 4 tốt hơn.

  2. Dự án ColdSpring có một số công cụ tuyệt vời để tự động tạo và làm việc với các đối tượng proxy từ xa cũng có thể kết hợp bảo mật thông qua Lập trình hướng-khía cạnh (AOP). Sự kết hợp của proxy từ xa và AOP cực kỳ mạnh mẽ và có thể cho phép bạn tạo các phương thức từ xa mà không để lộ các đối tượng tiềm ẩn thực sự và ngăn chặn và cho phép mỗi yêu cầu đối với các phương thức đó mà không cần phải nhập mã vào mọi phương thức. Thực tế, bản thân các phương thức thậm chí không nhận thức được chúng đang được bảo đảm.

Tôi sẽ chọn tùy chọn 4. Nó có vẻ giống như một quá trình khó khăn và cực kỳ cao, và theo một số cách, nhưng nó thực sự dễ dàng hơn nhiều so với bạn nghĩ. Các bước được nêu trong hướng dẫn bắt đầu nhanh của ColdSpring. http://www.coldspringframework.org/index.cfm/go/documentation

+1

Thật buồn cười. Tôi vừa nhận ra Stack Overflow đang lấy sự tự do của việc đổi tên danh sách của tôi. Trong màn hình chỉnh sửa nó là 1,2,3,4 và hiển thị nó là 1,2,1,2. –

3

Xin lưu ý rằng nếu bạn có phương thức có thể truy cập từ xa ... bất kỳ ai đều có thể gọi. Không chỉ mã AJAX của bạn. Máy chủ CF không biết liệu các yêu cầu đến từ proxy AJAX của bạn hay liệu chúng có đến từ bất kỳ ai khác chỉ thực hiện cuộc gọi từ xa hay không.

Và với phương pháp này DB chèn, tôi nghĩ rằng bạn đang để lại cho mình một chút mở ở đây. Nhưng điều này áp dụng ngay cả với các cuộc gọi loại đọc ... bạn cần lưu ý rằng - theo mặc định - bất kỳ ai cũng có thể thực hiện cuộc gọi từ xa và thực hiện việc đọc đó.

Điều bạn thực sự cần làm là đặt một số loại xác thực & ủy quyền tại chỗ, vì vậy chỉ các yêu cầu bị xử phạt mới có thể thực hiện cuộc gọi từ xa. Yêu cầu người dùng thiết lập một phiên bằng cách nào đó (như đăng nhập) và chỉ chấp nhận các yêu cầu từ xa từ các phiên được ủy quyền.

+0

Adam, đây là lời khuyên tốt khi bạn cung cấp nó năm ngoái. Tôi đã đưa ra một kế hoạch bảo mật tuyệt vời để bảo vệ các CFC của tôi. Một lần nữa cám ơn! –

3

Nếu bạn đang kiểm tra xem ai đó đã đăng nhập trong tệp Application.cfc của bạn thì điều này là tốt. Yêu cầu AJAX giống như bất kỳ yêu cầu nào khác và sẽ đi qua Application.cfc trước.

Bạn có thể thử nghiệm điều này bằng cách đặt lệnh hủy bỏ trong onRequestStart() và thấy rằng không có gì được chèn vào. Nó có lẽ sẽ thất bại âm thầm và không phải là giải pháp thanh lịch nhất nhưng nó sẽ hoạt động.

3

Dưới đây là một cách để bạn có thể giúp bảo vệ CFC truy cập từ xa của bạn khỏi bị các ứng dụng 'không được ủy quyền' gọi.

Sử dụng verifyClient() hoặc cffunction thuộc tính verifyClient="true"

Phương pháp verifyClient()verifyClient thuộc tính đảm bảo rằng yêu cầu gọi điện thoại đã bao gồm một thẻ an ninh được mã hóa mà Coldfusion tạo ra cho ứng dụng của bạn. Mã thông báo bảo mật đó được gửi ngầm cùng với dữ liệu của bạn khi bạn thực hiện cuộc gọi tới CFC của mình bằng cách sử dụng <cfajaxproxy>. Nếu mã thông báo đó không được bao gồm trong yêu cầu, Coldfusion sẽ ném một ngoại lệ.

<cffunction name="myMethod" access="remote"> 

    <!--- Prevent requests that have not originated from this application ---> 
    <cfset verifyClient() > 

    ... 

</cffunction> 

<!-- Or ---> 

<cffunction name="myMethod" access="remote" verifyClient="true"> 

    ... 

<cffunction> 

** Railo 3.2.x không hỗ trợ phương pháp verifyClient(). Bạn sẽ phải bắt chước hành vi nếu muốn.

+1

Phương pháp này là tuyệt vời nếu bạn biết rằng bạn sẽ luôn sử dụng cfajaxproxy của các công cụ CF Ajax khác. Nhưng tôi nghĩ rằng nó nhanh chóng trở thành một PITA nếu bạn muốn thực hiện cuộc gọi ajax từ xa từ một cuộc gọi không được tạo ra CF (như một cuộc gọi jQuery $ .ajax() đơn giản). –

+0

@ Jason - vâng hoàn toàn.Nếu OP chỉ muốn gọi để sinh ra từ ứng dụng của mình, thì nó có ý nghĩa, nếu không sử dụng verifyClient() sẽ không phải là cách tiếp cận tốt nhất. – jalpino

+0

Cuối cùng tôi đã thực hiện hành vi verifyClient() của bạn. Cảm ơn ý tưởng tuyệt vời. –