2010-04-11 21 views
14

HTML có nên được mã hóa trước khi được lưu trữ trong cơ sở dữ liệu không? Hoặc là thực hành bình thường để mã hóa trên đường ra trình duyệt?HTML có nên được mã hóa trước khi được duy trì không?

Tất cả độ dài trường dựa trên văn bản của tôi có được tăng gấp bốn lần trong cơ sở dữ liệu để cho phép lưu trữ thêm không?

Looking for thực hành tốt nhất chứ không phải là có rắn hay không :-)

+1

Các phương pháp hay nhất thường là wiki cộng đồng. :) – bzlm

Trả lời

15

Dữ liệu trong cơ sở dữ liệu của bạn có thực sự là HTML hay dữ liệu ứng dụng như tên hoặc nhận xét bạn vừa biết sẽ kết thúc như một phần của trang HTML?

Nếu đó là dữ liệu ứng dụng, tôi nghĩ rằng nó tốt nhất để:

  • đại diện nó trong một hình thức mà nguồn gốc từ môi trường (ví dụ unencoded trong cơ sở dữ liệu), và
  • chắc chắn nó đúng dịch khi nó vượt qua ranh giới đại diện (mã hóa khi bạn tạo trang HTML).

Nếu bạn là người hâm mộ MVC, điều này cũng giúp tách chế độ xem/bộ điều khiển khỏi mô hình (và từ định dạng lưu trữ liên tục).

Đại diện

Ví dụ, giả sử một người nào đó để lại nhận xét "Tôi yêu M & Bà". Nó có thể dễ dàng nhất để đại diện cho nó trong mã như chuỗi văn bản thuần túy "I love M&Ms", không phải là chuỗi mã hóa HTML "I love M&Ms". Về mặt kỹ thuật, dữ liệu như nó tồn tại trong mã không phải là HTML và cuộc sống là dễ nhất nếu dữ liệu được biểu diễn đơn giản như chính xác nhất có thể. Dữ liệu này sau này có thể được sử dụng trong một chế độ xem khác, ví dụ: ứng dụng trên máy tính để bàn. Dữ liệu này có thể được lưu trữ trong cơ sở dữ liệu, tệp phẳng hoặc trong tệp XML, có thể sau này được chia sẻ với một chương trình khác. Đơn giản nhất của nó cho các chương trình khác để giả sử chuỗi là trong "bản địa" đại diện cho các định dạng: "I love M&Ms" trong một cơ sở dữ liệu và tập tin phẳng và "I love M&Ms" trong tệp XML. Tôi sẽ cringe để xem giá trị mã hóa HTML được mã hóa trong một tập tin XML ("I love &Ms").

Dịch

Sau đó, khi dữ liệu được sắp qua ranh giới đại diện (ví dụ như hiển thị dưới dạng HTML, lưu trữ trong một cơ sở dữ liệu, tập tin văn bản đơn giản, hoặc tập tin XML), sau đó nó quan trọng để đảm bảo rằng nó được dịch đúng cách để nó được thể hiện chính xác theo định dạng có nguồn gốc từ môi trường tiếp theo đó. Trong ngắn hạn, khi bạn đi để hiển thị nó trên một trang HTML, hãy chắc chắn nó được dịch sang HTML được mã hóa đúng (thủ công hoặc thông qua một công cụ) để giá trị được hiển thị chính xác trên trang. Khi bạn đi lưu trữ nó trong cơ sở dữ liệu hoặc sử dụng nó trong một truy vấn, sử dụng các lệnh thoát và/hoặc các câu lệnh chuẩn bị và biến ràng buộc để đảm bảo cùng một giá trị khái niệm được biểu diễn chính xác tới cơ sở dữ liệu. Khi bạn đi lưu trữ nó trong một tệp XML, bạn đảm bảo mã hóa XML của nó.

Không dịch đúng khi vượt qua ranh giới đại diện là nguồn tiêm tấn công các cuộc tấn công SQL injection như vậy. Hãy tận tâm điều đó bất cứ khi nào bạn đang làm việc với nhiều biểu diễn/ngôn ngữ (ví dụ: Java, SQL, HTML, Javascript, XML, v.v.).

-

Mặt khác, nếu bạn đang thực sự cố gắng để lưu các mảnh trang HTML sang cơ sở dữ liệu, sau đó tôi không rõ ràng bởi những gì bạn có nghĩa là bằng cách "mã hóa trước khi được lưu trữ". Nếu đó là HTML hợp lệ, tất cả các giá trị cần thiết phải được mã hóa (ví dụ: &, <, v.v ...).

0

Vì lý do an ninh, có bạn nên đầu tiên chuyển đổi html để các tổ chức của họ và sau đó chèn vào cơ sở dữ liệu. Các cuộc tấn công như XSS được bắt đầu khi bạn cho phép người dùng (hoặc thay vì kẻ xấu) sử dụng thẻ html và sau đó bạn xử lý/chèn chúng vào databse. XSS là một trong những nguyên nhân gốc rễ của hầu hết các lỗ hổng bảo mật. Vì vậy, bạn chắc chắn cần phải mã hóa html của bạn trước khi lưu trữ nó.

+1

Điều này có thể không phải lúc nào cũng tốt, bởi vì tôi đã xóa dữ liệu gốc tại đây! –

+0

@Mahesh nếu dữ liệu gốc là tấn công XSS thì sao? – mxmissile

+3

Chèn HTML độc hại vào cơ sở dữ liệu không phải là một nguy cơ bảo mật. Chỉ trình bày HTML độc hại đó cho trình duyệt là một. Vì vậy, * không * cần thiết để thay thế các ký tự đặc biệt HTML bằng các tham chiếu ký tự khi chèn HTML vào cơ sở dữ liệu. Chỉ cần thay thế/thoát ký tự đặc biệt theo ngữ cảnh của SQL. – Gumbo

13

Thực tiễn là mã hóa HTML trước hiển thị.

Nếu bạn nhất quán về mã hóa trước khi hiển thị, bạn đã thực hiện một chút tốt của việc ngăn chặn XSS.

Bạn nên lưu biểu mẫu gốc trong cơ sở dữ liệu của mình. Điều này được giữ nguyên bản gốc và bạn có thể thực hiện các thao tác khác trên rằng và không phải trên phiên bản được mã hóa.

+0

Hmmm, tôi đã cố gắng tránh mã hóa cho mỗi yêu cầu duy nhất xem như một nhiệm vụ lặp đi lặp lại của nó. Mặc dù thú vị :) –

+0

Một số khung công tác sẽ tự động mã hóa. – Oded

+0

+1 Tốt để mã hóa khi hiển thị và không khi lưu trữ, vì bạn sẽ có dữ liệu gốc với u, nếu u cần xử lý dữ liệu khác nhau. –

2

Thoát khỏi nhà cung cấp cơ sở dữ liệu cụ thể trên đầu vào, thoát HTML trên đầu ra.

1

Tôi không đồng ý với mọi người nghĩ rằng nó nên được giải mã tại thời điểm hiển thị, khả năng xảy ra tấn công nếu mã hóa được mã hóa trước khi nó đến cơ sở dữ liệu chỉ có thể xảy ra nếu mục đích của nhà phát triển giải mã trước khi hiển thị nó. Tuy nhiên, nếu bạn giải mã nó trước khi trình bày nó luôn luôn là một cơ hội mà nó có thể xảy ra bởi một số nhà phát triển newbie khác, như một thuê mới, hoặc thực hiện một xấu. Nếu nó ngồi ở đó không bị mã hóa, chỉ cần chờ đợi để bật ra trên internet và lây lan như herpes. Mất dữ liệu ban đầu không phải là mối quan tâm. mã hóa + giải mã sẽ tạo ra cùng một dữ liệu mỗi lần. Chỉ cần hai xu của tôi.

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