2011-07-06 46 views
19

Tôi đang cố bật mã hóa Viewstate Luôn luôn làm biện pháp bảo mật cho trang web ASP.NET 3.5 được lưu trữ trong IIS6. Chúng tôi đã tắt ViewState nhưng vẫn thấy một số "controlstate" trong chuỗi này. Trong một môi trường thử nghiệm tôi có thể chỉ cần đặt sau trong web.config và tôi có thể base64 không còn giải mã ViewState để bán bản rõ:asp.net Viewstate encryption issue

<pages enableViewState="false" enableViewStateMac="true" viewStateEncryptionMode="Always">

Tôi thậm chí còn nói thêm như sau (genereated bởi machine key generater) để Machine.config và vẫn mã hóa tốt ViewState trên máy chủ thử nghiệm của tôi:

<machineKey validationKey="002..." decryptionKey="D90E..." validation="SHA1" decryption="AES" />

môi trường không thử nghiệm của tôi dường như không nhận những thay đổi trên như tôi có thể giải mã luôn base64 ViewState để văn bản đơn giản với các cài đặt ở trên. Tôi luôn luôn iisreset sau khi tôi thực hiện bất kỳ thay đổi.

Một số thông tin về máy chủ web không thử nghiệm của tôi:

  • Web Farm/cân bằng tải (nhưng chỉ có một máy chủ lên để thử nghiệm ngay bây giờ)
  • Sql phiên Nhà nước (machinekey trong machine.config ban đầu cần thiết để thiết lập này)
  • Machine.config: triển khai bán lẻ = "true"

bất cứ ai có thể đề xuất nơi để tìm kiếm các thiết lập bổ sung mà có thể can thiệp vào mã hóa asp.net ViewState? EDIT: Bây giờ trên máy chủ kiểm tra iis của tôi, tôi không thể hoàn tác cài đặt viewStateEncryptionMode vì nó đang mã hóa ViewState ngay cả khi tôi đặt nó thành "Không bao giờ" và không có trang web nào khác của tôi có vẻ giữ cài đặt này. Tôi có thể nhìn thấy nơi tài sản này bị ghi đè ở đâu? Có bất kỳ bộ nhớ cache nơi cài đặt này được lưu trữ mà cần phải được xóa bên cạnh những gì sẽ được thực hiện khi tôi iisreset/stop www service/touch machine.config?

EDIT CUỐI CÙNG: Sau ngày học tập tin cấu hình, tôi đã từ bỏ và thực hiện điều này thông qua mã. Tôi đã có một mô-đun bảo mật được gắn vào các sự kiện trang vì vậy trong Page_Load tôi đã thêm: Page.RegisterRequiresViewStateEncryption();

Tôi thực sự muốn biết điều gì đã ngăn cản cài đặt này nhận được trên IIS6 immediatley. Khi tôi chạy cassini cục bộ nếu tôi đặt viewStateEncryptionMode thành "Always" qua nút trang, tôi sẽ ngay lập tức thấy nó mã hóa ViewState và hiển thị trường ẩn bổ sung với id = "__ VIEWSTATEENCRYPTED". Khi tôi sau đó đặt nó thành "Không bao giờ" tôi sẽ ngay lập tức thấy mã hóa tắt. Nếu tôi thực hiện cùng một thay đổi chính xác cho trang web trên trang web lưu trữ IIS6 của tôi, nó sẽ không có hiệu lực ngay lập tức nhưng nếu tôi cho phép thiết lập ở lại đó, nó cuối cùng sẽ giữ. Tôi sẽ ngừng/bắt đầu dịch vụ www, thiết lập lại iis, bộ nhớ cache tạm thời ASPNET nhưng tôi không biết những gì khác để thử? Hy vọng bài đăng này có thể ROT trong một thời gian và một người nào đó trong tương lai sẽ thấy hành vi tương tự mà tôi đã trải nghiệm và chúng tôi có thể tìm hiểu thêm điều này!

+5

Hóa ra RegisterRequiresViewStateEncryption cũng bật xác thực ViewstateMAC mặc dù tôi đã đặt rõ ràng điều này thành false trong web.config của mình. Vì trang web của tôi là một "MVC" tùy chỉnh nằm trên đầu trang của WebForms, nơi tôi chuyển hướng đến các trang khác nhau đôi khi trên POSTS tôi không thể xác thực MAC. Tôi nghĩ rằng các thiết lập web.config của ViewStateMAC = false và ViewStateEncryption = true không phải là một sự kết hợp tốt. – felickz

Trả lời

2

Tôi biết đã lâu rồi kể từ khi bạn đăng nội dung này, nhưng bạn đã cân nhắc việc triển khai PageStatePersister của riêng mình chưa? PageStatePersister là thành phần chịu trách nhiệm định dạng dữ liệu ViewState và ControlState được nhúng trong trang của bạn. Nếu bảo mật là mối quan tâm chính của bạn, bạn có thể sử dụng bất kỳ thuật toán mã hóa nào bạn muốn đảm bảo dữ liệu của mình vẫn là riêng tư. Dựa trên cấu hình của bạn, có vẻ như bạn đang ở trong một môi trường khá có khả năng, vì vậy rõ ràng là tải thử nghiệm trước.Nó cũng đáng nói đến là tôi không có ý tưởng về hoặc kinh nghiệm với sự tham gia của lớp MVC trong ViewState khi được kết hợp trong một trang web ASP.NET WebForms "cổ điển".

Chúc may mắn.

B

+0

Cảm ơn bạn đã đề xuất. Tôi chưa bao giờ khám phá con đường này, nhìn vào tất cả các vấn đề có thể được gây ra bằng cách đặt ViewState trong phiên tôi đi lạc khỏi việc cuộn PageStatePersister của riêng tôi. Nếu tôi mở nó ra, tôi chắc chắn sẽ khám phá ý tưởng của bạn về việc mã hóa phiên đó. – felickz

0

Tôi đoán là trang web cân bằng tải đó là nguồn gốc của sự nhầm lẫn. Bạn nói rằng chỉ "chỉ có một máy chủ [là] để thử nghiệm ngay bây giờ", nhưng tất cả các triệu chứng bạn đang trải qua âm thanh chính xác như những gì sẽ xảy ra nếu nhiều máy chủ trong trang trại đang chạy, nhưng bạn chỉ thực hiện web.config và thay đổi machine.config trên một máy chủ. Khi bạn nhấn trang web với trình duyệt của mình, đôi khi bạn sẽ nhấn một máy chủ được định cấu hình theo một cách, đôi khi bạn sẽ nhấn một máy chủ khác được định cấu hình theo cách khác.

+0

Suy nghĩ đó vượt qua tâm trí tôi nhiều lần trong suốt cả tuần tôi đã chơi với điều này. Tôi liên tục kiểm tra này, và khi thất vọng di chuyển đến máy chủ dev của tôi mà không được cân bằng tải. NHƯNG bạn có một điểm hợp lệ và điều quan trọng là tất cả mọi người trong một môi trường cân bằng tải để hiểu – felickz