2011-11-22 37 views
10

Tôi hiện đang làm việc trên trang web ASP.NET MVC và tôi đã đi đến một điểm mà tôi cần tích hợp cơ sở dữ liệu vào trang web.Làm cách nào để lưu trữ và truy cập an toàn chi tiết chuỗi kết nối?

Thông thường tôi chỉ cần thêm chuỗi kết nối phù hợp với tập tin Web.config:

<add name="MainDB" 
    connectionString="Server=localhost; Database=TopSecretData; User Id=Joe; 
    password=password" providerName="System.Data.SqlClient" /> 

Nhưng rõ ràng là có một lỗ hổng an ninh rõ ràng nếu tôi rời khỏi Id người dùng và mật khẩu của tôi ngay trong Web.config, đặc biệt khi đó là thuộc nguồn điều khiển.

Tóm lại: Làm cách nào để lưu trữ chi tiết chuỗi kết nối của tôi mà không hiển thị công khai?

Trả lời

15

Thực tiễn tốt nhất là mã hóa phần chuỗi kết nối của bạn. Sử dụng aspnet_regiis.exe, có thể được tìm thấy ở những nơi khác nhau:

  • Start - Visual Studio - Visual Studio Tools - Visual Studio Command Prompt
  • C: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319 (đảm bảo bạn chạy như một quản trị viên)

Trước:

<configuration> 
<connectionStrings> 
<add name="MainConnectionString" 
connectionString="data source=Ratbert;database=Sales;username=ASPNET;password=$Double_Rainbow2011" 
providerName="System.Data.SqlClient"/> 
</connectionStrings> 
</configuration> 

chạy lệnh này:

aspnet_regiis –pef connectionStrings c:\PathToWebSite 

Hoặc, nếu lệnh trên không hoạt động (và bạn nhận được văn bản aspnet_regiis giúp đỡ), thử

aspnet_regiis -pe connectionStrings -app "/" -site 6 

nơi "6" là ID của trang web như báo cáo trong IIS.

Sau:

<connectionStrings configProtectionProvider="RsaProtectedConfigurationProvider"> 
    <EncryptedData Type="http://www.w3.org/2001/04/xmlenc#Element" 
    xmlns="http://www.w3.org/2001/04/xmlenc#"> 
    <EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#tripledes-cbc" /> 
    <KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#"> 
    <EncryptedKey xmlns="http://www.w3.org/2001/04/xmlenc#"> 
    <EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#rsa-1_5" /> 
    <KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#"> 
     <KeyName>Rsa Key</KeyName> 
    </KeyInfo> 
    <CipherData> 
     <CipherValue>Bf677iFrUFW ... +4n4ZZKXCTUAu2Y=</CipherValue> 
    </CipherData> 
    </EncryptedKey> 
    </KeyInfo> 
    <CipherData> 
    <CipherValue>UDEZ ...QfXUmM5rQ==</CipherValue> 
    </CipherData> 
    </EncryptedData> 
</connectionStrings> 

Bây giờ nó đang bị cắt xén, bạn không thể chỉnh sửa nó. Decrypt như thế này:

aspnet_regiis –pdf connectionStrings c:\PathToWebSite 

Hoặc

aspnet_regiis -pd connectionStrings -app "/" -site 6 

Và sau đó thay đổi và tái mã hóa.

Để đọc chuỗi kết nối, hãy sử dụng lớp tĩnh ConfigurationManager.

string connStr = 
ConfigurationManager 
.Connectionstrings["MainConnectionString"] 
.ConnectionString.ToString(); 

var myConnection = new SqlConnection(connStr); 

myConnection.Open(); 
+0

Hoàn hảo! Đây chính xác là những gì tôi đang tìm kiếm. –

1

Các cách tiếp cận phổ biến bao gồm encrypting the web.configstoring the connection strings in the registry.

Liên kết thứ hai là một phần của bài viết lớn hơn nhiều về cách bảo vệ đúng cách ứng dụng ASP.NET. Nó được viết cho WebForms, nhưng các nguyên tắc thì giống nhau. Đó là một đọc tốt và phần lớn nó vẫn được áp dụng ngày hôm nay, ngay cả khi nó là một chút cũ.

3

Một cách tiếp cận là sử dụng bất cứ điều gì an ninh tích hợp DB Mời bạn, do đó mật khẩu không phải là một vấn đề. Máy chủ được truy cập trực tiếp vào máy chủ mà không cần phải sử dụng mật khẩu, nhưng bạn phải thiết lập một người dùng chỉ có quyền truy cập từ chính máy chủ web.

ví dụ: Các DB như MySQL cho phép bạn chỉ định máy chủ nào có quyền truy cập vào nó, hạn chế truy cập từ bất cứ nơi nào khác - vì vậy một hacker không thể tới DB của bạn ngoại trừ từ máy chủ web. Điều này làm giảm bề mặt bảo mật khá nhiều và cho phép bạn lưu trữ các tệp chuỗi kết nối trong SCM của bạn.

Nó vẫn không an toàn 100% vì hacker có thể (thường dễ dàng) hack máy chủ web của bạn và xem DB từ đó. Bạn có thể lưu trữ mật khẩu ở nơi khác, nhưng điều đó chỉ làm mờ đi vấn đề - nếu máy chủ web có thể truy cập vào mật khẩu, hacker của bạn cũng có thể. (lưu ý, những nơi khác để lưu trữ mật khẩu bao gồm đăng ký, một tệp riêng biệt như tệp .udl hoặc nội dung nào đó trong/etc). Bạn có thể bảo mật tệp này để chỉ người dùng máy chủ web mới có thể đọc được, nhưng máy chủ web bị tấn công rõ ràng có thể đọc được! Vì vậy, bước tiếp theo là trừu tượng kết nối DB để bên ngoài máy chủ web, phương pháp thông thường là có một quy trình riêng biệt để lưu trữ logic nghiệp vụ của bạn (ví dụ: dịch vụ) hiển thị các phương pháp cố định - máy chủ web đơn giản gọi dịch vụ thực hiện công việc và trả về dữ liệu cho mã máy chủ web.

Nếu hacker đánh bại máy chủ web của bạn, tất cả những gì họ có thể làm là gọi phương thức trên dịch vụ, họ sẽ không có quyền truy cập trực tiếp vào DB để không thể hỏng hoặc sửa đổi nó. Thông thường sẽ có vài gợi ý cho hacker về những phương thức dịch vụ đã làm hoặc đã làm, và dịch vụ sẽ có một số lượng hợp lệ mã xác nhận cho tất cả các đầu vào để tin nhắn do hacker tạo ra (hy vọng) bị từ chối. (sử dụng dấu thời gian, bộ đếm, v.v. để cố gắng đánh bại các tác vụ được tạo thủ công tùy chỉnh cho dịch vụ).

Đây là phương pháp chúng tôi sử dụng cho hệ thống bảo mật cao (có rất nhiều điều bạn có thể làm để bảo đảm từng phân đoạn của chuỗi này bằng cách sử dụng cơ chế bảo mật OS chuẩn). Lý do để làm điều này trở nên rất rõ ràng với chúng tôi một khi an ninh của chúng tôi chap chứng minh một hack IIS đã cho anh ta một vỏ từ xa với đặc quyền quản trị. Bất cứ điều gì bạn làm để bảo vệ các cấu hình của bạn trên máy chủ web là vô nghĩa nếu một hacker nhận được điều đó.(và nó dễ dàng thực hiện - kể từ khi được sửa, nhưng có những lần khai thác 0 ngày được tìm thấy mọi lúc)

1

Bạn có thể lưu trữ chuỗi kết nối được mã hóa trong bộ nhớ cache. Máy chủ Cache có trên một máy chủ khác có mục đích (Giao tiếp này có thể bị giới hạn ở 1 cổng và địa chỉ IP khiến việc tấn công trở nên khó khăn hơn nhiều). Điều này sẽ nhận được chuỗi kết nối hoàn toàn khỏi máy chủ web và ngay cả khi một hacker truy cập vào bộ nhớ cache chúng được mã hóa. Điều quan trọng là tải các chuỗi vào bộ đệm và có thể được thực hiện từ xa, vì vậy các chuỗi kết nối đó không bao giờ được ghi vào ổ đĩa cứng của máy chủ. Mã này chỉ giải mã các chuỗi kết nối khi cần và không bao giờ giữ các chuỗi chưa được mã hóa đó trong một biến.

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