2012-04-14 44 views
6

Tôi đang cố gắng cải thiện bảo mật của ứng dụng của mình. Bất cứ khi nào tôi nhận được dữ liệu từ người dùng (cho dù thông qua POST hoặc GET) được cho là một số nguyên, tôi xác nhận điều đó một cách thích hợp. Nhưng thường dữ liệu là VARCHAR và đôi khi có thể chứa HTML.Bảo vệ khỏi việc tiêm SQL trong ColdFusion

Làm cách nào để bảo vệ DB của mình khỏi việc tiêm SQL trong trường hợp đó?

<cfqueryparam value="#form.textInput#" cfsqltype="cf_sql_varchar"> bảo vệ truy vấn gửi một câu lệnh SQL độc hại bên trong giá trị VARCHAR không?

Trả lời

5

Câu trả lời ngắn cho câu hỏi của bạn là 'có'.

Tôi chặn nỗ lực tấn công bằng ba phương pháp.

  1. Tôi sử dụng cfqueryparam trong tất cả các truy vấn cơ sở dữ liệu của mình. Tôi sẽ sử dụng cfparam ở đầu tệp mẫu/cfm cho các biến phạm vi url.

  2. Tôi đã sử dụng Portcullis hoặc các biến thể của nó. Bạn có thể lấy nó từ http://portcullis.riaforge.org/. Portcullis cũng sẽ bảo vệ chống lại một số cuộc tấn công kịch bản cross site.

  3. Tôi sử dụng Windows IIS 7.5 (Windows Server 2008 R2). Tôi sử dụng tính năng Viết lại URL để chặn số lượng lớn các cuộc tấn công dựa trên URL. Bạn có thể làm những việc tương tự với Apache và viết lại nó hỗ trợ. Dưới đây là quy tắc Rewrite URL IIS của tôi:

    <?xml version="1.0" encoding="UTF-8"?> 
    <appcmd> 
        <CONFIG CONFIG.SECTION="system.webServer/rewrite/globalRules" path="MACHINE/WEBROOT/APPHOST" overrideMode="Inherit" locked="false"> 
         <system.webServer-rewrite-globalRules> 
          <rule name="SQL Injection - EXEC - SCRIPT_NAME" stopProcessing="true"> 
           <match url="^.*EXEC\s*[\(|%28].*$" /> 
           <conditions logicalGrouping="MatchAll" trackAllCaptures="false"> 
           </conditions> 
           <serverVariables> 
           </serverVariables> 
           <action type="CustomResponse" statusCode="403" statusReason="Forbidden" statusDescription="Forbidden" /> 
          </rule> 
          <rule name="SQL Injection - EXEC - QS" stopProcessing="true"> 
           <match url=".*" /> 
           <conditions logicalGrouping="MatchAll" trackAllCaptures="false"> 
            <add input="{QUERY_STRING}" pattern="^.*EXEC\s*[\(|%28].*$" /> 
           </conditions> 
           <serverVariables> 
           </serverVariables> 
           <action type="CustomResponse" statusCode="403" statusReason="Forbidden" statusDescription="Forbidden" /> 
          </rule> 
          <rule name="SQL Injection - CAST - SCRIPT_NAME" stopProcessing="true"> 
           <match url="^.*CAST\s*[\(|%28].*$" /> 
           <conditions logicalGrouping="MatchAll" trackAllCaptures="false"> 
           </conditions> 
           <serverVariables> 
           </serverVariables> 
           <action type="CustomResponse" statusCode="403" statusReason="Forbidden" statusDescription="Forbidden" /> 
          </rule> 
          <rule name="SQL Injection - CAST - QS" stopProcessing="true"> 
           <match url=".*" /> 
           <conditions logicalGrouping="MatchAll" trackAllCaptures="false"> 
            <add input="{QUERY_STRING}" pattern="^.*CAST\s*[\(|%28].*$" /> 
           </conditions> 
           <serverVariables> 
           </serverVariables> 
           <action type="CustomResponse" statusCode="403" statusReason="Forbidden" statusDescription="Forbidden" /> 
          </rule> 
          <rule name="SQL Injection - DECLARE - SCRIPT_NAME" stopProcessing="true"> 
           <match url="^.*DECLARE.*$" /> 
           <conditions logicalGrouping="MatchAll" trackAllCaptures="false"> 
           </conditions> 
           <serverVariables> 
           </serverVariables> 
           <action type="CustomResponse" statusCode="403" statusReason="Forbidden" statusDescription="Forbidden" /> 
          </rule> 
          <rule name="SQL Injection - DECLARE - QS" stopProcessing="true"> 
           <match url=".*" /> 
           <conditions logicalGrouping="MatchAll" trackAllCaptures="false"> 
            <add input="{QUERY_STRING}" pattern="^.*DECLARE.*$" /> 
           </conditions> 
           <serverVariables> 
           </serverVariables> 
           <action type="CustomResponse" statusCode="403" statusReason="Forbidden" statusDescription="Forbidden" /> 
          </rule> 
          <rule name="SQL Injection - NVARCHAR - SCRIPT_NAME" stopProcessing="true"> 
           <match url="^.*CHAR\s*[\(|%28].*$" /> 
           <conditions logicalGrouping="MatchAll" trackAllCaptures="false"> 
           </conditions> 
           <serverVariables> 
           </serverVariables> 
           <action type="CustomResponse" statusCode="403" statusReason="Forbidden" statusDescription="Forbidden" /> 
          </rule> 
          <rule name="SQL Injection - NVARCHAR - QS" stopProcessing="true"> 
           <match url=".*" /> 
           <conditions logicalGrouping="MatchAll" trackAllCaptures="false"> 
            <add input="{QUERY_STRING}" pattern="^.*CHAR\s*[\(|%28].*$" /> 
           </conditions> 
           <serverVariables> 
           </serverVariables> 
           <action type="CustomResponse" statusCode="403" statusReason="Forbidden" statusDescription="Forbidden" /> 
          </rule> 
          <rule name="SQL Injection - sp_password - SCRIPT_NAME" stopProcessing="true"> 
           <match url="^.*sp_password.*$" /> 
           <conditions logicalGrouping="MatchAll" trackAllCaptures="false"> 
           </conditions> 
           <serverVariables> 
           </serverVariables> 
           <action type="CustomResponse" statusCode="403" statusReason="Forbidden" statusDescription="Forbidden" /> 
          </rule> 
          <rule name="SQL Injection - sp_password - QS" stopProcessing="true"> 
           <match url=".*" /> 
           <conditions logicalGrouping="MatchAll" trackAllCaptures="false"> 
            <add input="{QUERY_STRING}" pattern="^.*sp_password.*$" /> 
           </conditions> 
           <serverVariables> 
           </serverVariables> 
           <action type="CustomResponse" statusCode="403" statusReason="Forbidden" statusDescription="Forbidden" /> 
          </rule> 
          <rule name="SQL Injection - xp - SCRIPT_NAME" stopProcessing="true"> 
           <match url="^.*%20xp_.*$" /> 
           <conditions logicalGrouping="MatchAll" trackAllCaptures="false"> 
           </conditions> 
           <serverVariables> 
           </serverVariables> 
           <action type="CustomResponse" statusCode="403" statusReason="Forbidden" statusDescription="Forbidden" /> 
          </rule> 
          <rule name="SQL Injection - xp - QS" stopProcessing="true"> 
           <match url=".*" /> 
           <conditions logicalGrouping="MatchAll" trackAllCaptures="false"> 
            <add input="{QUERY_STRING}" pattern="^.*%20xp_.*$" /> 
           </conditions> 
           <serverVariables> 
           </serverVariables> 
           <action type="CustomResponse" statusCode="403" statusReason="Forbidden" statusDescription="Forbidden" /> 
          </rule> 
         </system.webServer-rewrite-globalRules> 
        </CONFIG> 
    </appcmd> 
    

Những quy định này được bổ sung vào thư mục C: \ Windows \ System32 \ inetsrv \ config \ applicationHost.config file cho IIS. Tuy nhiên tôi không **** KHÔNG **** khuyên bạn nên chỉnh sửa trực tiếp tệp này. Một lỗi và IIS sẽ không tải. Thay vào đó, hãy sao chép & dán các quy tắc ở trên và lưu chúng dưới dạng "iis-global-rewrite.xml". Sau đó chạy tệp lô sau để thêm quy tắc vào máy chủ IIS của bạn:

C:\Windows\System32\inetsrv\appcmd.exe set config -in < iis-global-rewrite.xml 

Quy tắc ghi đè IIS sẽ hoạt động với IIS 7.0 (Windows Server 2008) nhưng tôi chưa thử nghiệm.

Các quy tắc này cũng có thể được áp dụng cho một trang web bằng cách sử dụng tệp web.config nếu bạn không có quyền truy cập vào máy chủ.

Tại sao tôi sử dụng ba phương pháp khác nhau để bảo vệ? Bởi vì không ai trong số họ bao gồm tất cả các căn cứ. Các quy tắc viết lại IIS chỉ bảo vệ chống lại các cuộc tấn công dựa trên URL. Tin tặc cũng có thể sử dụng các cuộc tấn công gửi biểu mẫu làm điều tương tự. Tôi thích các quy tắc IIS như là một dòng bảo vệ đầu tiên bởi vì nó sẽ làm việc với tất cả các trang trên máy chủ bao gồm PHP, ASP, vv. Portcullis là một dòng thứ hai để bảo vệ ColdFusion vì nó sẽ bắt các cuộc tấn công dựa trên biểu mẫu và tấn công. Dòng phòng thủ cuối cùng là mã cfqueryparam/cfparam bảo vệ chống lại các cuộc tấn công SQL injection dựa trên URL/biểu mẫu.

Nếu cả ba phương pháp này đều được sử dụng thì máy chủ/trang web phải rất an toàn. Tôi vẫn khuyên bạn nên xem lại nhật ký máy chủ theo thời gian vì các cuộc tấn công phát triển và cải thiện.

+1

Chà, điều đó hoàn hảo. Tôi thực sự đang chạy CF trên IIS, vì vậy tôi chắc chắn sẽ xem xét việc bảo mật ứng dụng web của tôi với một số quy tắc viết lại nâng cao hơn. Cảm ơn! – Eleeist

+0

Viết lại URL IIS và Apache mod_rewrite là những công cụ rất hữu ích cho việc bảo vệ và SEO. http://blogs.iis.net/ruslany/archive/2009/04/08/10-url-rewriting-tips-and-tricks.aspx có một số ví dụ hữu ích cho Viết lại URL IIS. –

6

Câu trả lời ngắn gọn là có.

cfqueryparam sẽ ngừng một số cuộc tấn công tiêm sql xảy ra.

Có các biến tấn công khác có thể được sử dụng, vì vậy hãy cẩn thận, nhưng cũng có thể được viết rất lạnh.

Hãy cảnh giác với các cuộc tấn công tập lệnh Cross site nếu bạn đang lưu trữ và sau đó hiển thị html đầu vào, đặc biệt cẩn thận với các thẻ javascript.

+0

Cảm ơn! Điều đó thực sự hữu ích. – Eleeist

+3

Lần duy nhất cfqueryparam sẽ * không * dừng một cuộc tấn công SQL injection sẽ không có gì liên quan đến bản chất của cuộc tấn công, nhưng bản chất của mã trên cơ sở dữ liệu. Ví dụ, nếu bạn đã gọi một số thủ tục cơ sở dữ liệu mà đã lấy một đối số varchar và chạy nó tự động như SQL, không có số lượng truy vấn parametized sẽ giúp bạn. CfQueryParam sẽ * luôn luôn * ngăn chặn các cuộc tấn công SQL injection khi sử dụng SQL thuần túy (không có các cuộc gọi thủ tục cơ sở dữ liệu, vv). –

+1

Đừng quên sử dụng 'maxlength' cũng trên các trường văn bản có độ dài thay đổi khi thích hợp. Nếu bạn biết một trường văn bản sẽ chỉ có chuỗi dài tối đa 16 ký tự, chẳng hạn, không cần phải cho phép chuỗi dài hơn vì chúng phải được gắn cờ là lỗi. –

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