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.
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.
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.
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.
Nguồn
2012-04-15 02:48:37
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
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. –