2010-01-13 21 views
7

Tôi có một trình soạn thảo cho phép người dùng thêm HTML được lưu trữ trong cơ sở dữ liệu và được hiển thị trên trang web. Vì đây là đầu vào không tin cậy, tôi dự định sử dụng Microsoft.Security.Application.AntiXsSS.GetSafeHtmlFragment để khử trùng HTML.Vệ sinh HTML trước khi lưu trữ trong DB hoặc trước khi hiển thị? (Thư viện AntiXSS trong ASP.NET)

  • Tôi có nên santiize trước khi lưu vào cơ sở dữ liệu hoặc trước khi hiển thị đầu vào không đáng tin cậy vào trang web không?
  • Có lợi thế nào trong việc bao gồm mã nguồn AntiXSS trong dự án của tôi thay vì chỉ là DLL không? (Có lẽ tôi có thể tùy chỉnh các danh sách trắng?)
  • Những tập tin lớp tôi nên nhìn vào thực hiện thực tế của GetSafeHtmlFragment

Trả lời

28

Tôi không đồng ý với câu trả lời được lựa chọn vì hai lý do

  1. Nếu bạn lưu trữ dữ liệu được mã hóa, bạn phải chọn một bộ mã hóa trước khi bạn lưu trữ. Điều gì sẽ xảy ra nếu bạn đã lưu trữ một thứ gì đó dưới dạng HTML nhưng cũng muốn đẩy nó ra ở định dạng khác, ví dụ như một phản hồi JSON, hoặc như là một phần của một tài liệu XML? Bây giờ bạn có một định dạng mã hóa HTML, bạn phải giải mã, sau đó mã hóa theo định dạng đúng.
  2. Điều gì sẽ xảy ra nếu chúng tôi phát hiện lỗi trong bộ mã hóa và đẩy phiên bản mới ra? Bây giờ, bởi vì bạn không mã hóa tại điểm đầu ra, tất cả dữ liệu cũ của bạn có thể chứa những thứ đã được mã hóa không chính xác. Bạn có thể mã hóa lại, nhưng sau đó bạn nhấn các vấn đề mã hóa kép có thể gây đau đớn để lọc chính xác.

Nói chung, bạn mã hóa tại điểm đầu ra và xử lý bất kỳ dữ liệu nào đến từ kho dữ liệu không tin cậy theo mặc định - sau khi tất cả, điều gì sẽ xảy ra nếu ai đó quản lý cơ sở dữ liệu của bạn trực tiếp hoặc thông qua SQL injection?

+1

Tôi đã trở lại và bình chọn bạn bởi vì tôi đồng ý với các đối số của bạn và đề xuất của bạn phù hợp với đề xuất của OWASP. Hy vọng rằng, @ user102533 sẽ chuyển đổi và chấp nhận của bạn. – David

+1

Anh ấy không lưu trữ dữ liệu được mã hóa, anh ấy đang lưu trữ dữ liệu được khử trùng - sự khác biệt lớn (nó vẫn chưa được mã hóa HTML) – orip

+0

Điểm 2 vẫn đứng đó (và vâng, tôi không chú ý nhiều đến việc đọc!) Điều gì sẽ xảy ra nếu có một lỗi trong chất khử trùng? Hoặc bạn muốn thay đổi các quy tắc an ủi? – blowdart

3
  • các Cả
  • Chỉ khi bạn có kế hoạch thay đổi nó, mà tôi sẽ không làm cá nhân
  • lớp AntiXss (kể từ khi nó được gọi như AntiXss.GetSafeHtmlFragment())
+0

Đã có mã HTML trong cơ sở dữ liệu, nếu tôi khử trùng nó trước khi thêm nó vào cơ sở dữ liệu, thì tôi cần phải khử trùng dữ liệu đã tồn tại (để nhất quán). Nhưng có giá trị nào trong việc khử trùng trước khi thêm nó vào cơ sở dữ liệu không? – Nick

+0

Với tôi, giá trị chính là có thể một số người mới làm cho ứng dụng web tiếp theo đọc từ DB của bạn.Bạn không bao giờ biết ai sẽ tiếp quản sau khi bạn chuyển sang đồng cỏ xanh hơn. Ngoài ra, nó chỉ là tốt để có được trong thói quen làm nó vì vậy nó là bản chất thứ hai. – David

+0

+1 để vệ sinh mọi lúc, chỉ trong trường hợp. Điều duy nhất để nhận thức được là một hit hiệu suất có thể, trong trường hợp này bạn có thể khử trùng chỉ vào tiết kiệm cho DB nhưng sau đó bạn cần phải cẩn thận rằng tất cả các thông tin trong DB là thực sự sanitized. – orip

-1

Bạn có thể sử dụng trong chỉ thị trang thông số ValidateRequest = "true". Bằng cách này, tất cả dữ liệu Yêu cầu được xác thực và nếu có vấn đề xác thực bạn luôn có thể bắt lỗi. Nó cũng ngăn chặn các chủ đề tiêm sql và những người khác không chỉ có thể XSS.

Với dữ liệu số, bạn có thể xác nhận số nguyên tràn hoặc lạm dụng các loại dữ liệu với Int32.TryParse() hoặc bất kỳ khác của gia đình TryParse (Byte.TryParse Int16.TryParse ...)

Không cần phải sử dụng bất kỳ lớp nào khác hoặc phương pháp khử trùng bổ sung.

+0

Yêu cầu xác thực được bật theo mặc định nhưng bạn đang đặt quá nhiều niềm tin vào nó. Bạn cần xử lý nó như là một lớp bảo mật được bổ sung bởi xác nhận danh sách trắng tại điểm đầu vào (bạn sắp xếp chạm vào việc phân tích cú pháp int này) và mã hóa đầu ra. Nó cũng sẽ không làm nhiều cho bạn về SQL Injection; tuyên bố “'hoặc 1 = 1” sẽ đi qua. Điều này có thể giúp giải thích cho bạn một chút tốt hơn: http://www.troyhunt.com/2010/05/owasp-top-10-for-net-developers-part-2.html –

8

Hãy nghe theo số OWASP podcast 67 with Jeff Williams on XSS. Anh ấy nói về việc không khử trùng hoặc mã hóa trước khi lưu trữ. Lý do chính là nếu (khi) thư viện phát triển để đáp ứng với các lỗ hổng mới dữ liệu của bạn sẽ bị mắc kẹt trở lại trong phiên bản cũ. Tất nhiên điều này không ngăn bạn chạy bất kỳ đầu vào nào đối với danh sách cho phép tại điểm vào và từ chối bất kỳ điều gì ngoài phạm vi chấp nhận được.

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