2017-08-18 66 views
10

Chỉ muốn hiểu suy nghĩ ở đây và đến một cách tiếp cận chính xác và được chấp nhận cho vấn đề này. Đối với ngữ cảnh, điều này là trong một môi trường web và chúng ta đang nói về thoát trên đầu vào cho cơ sở dữ liệu.Lưu trữ mã độc hại trong cơ sở dữ liệu - là thoát-trên-đầu ra luôn luôn là cách tiếp cận chính xác?

Tôi hiểu nhiều lý do đằng sau việc không thoát trên đầu vào khi đưa người dùng nhập và lưu trữ nó vào cơ sở dữ liệu. Bạn có thể muốn sử dụng đầu vào đó theo nhiều cách khác nhau (như JSON, dưới dạng SMS vv) và bạn cũng có thể muốn hiển thị đầu vào đó cho người dùng ở dạng ban đầu của nó.

Trước khi đưa bất kỳ thứ gì vào cơ sở dữ liệu, chúng tôi đảm bảo không có các cuộc tấn công SQL injection để bảo vệ cơ sở dữ liệu.

Tuy nhiên following the principals set out herehere, họ đề xuất phương pháp lưu dữ liệu nhập của người dùng như hiện tại. Đầu vào của người dùng này có thể không phải là một cuộc tấn công SQL injection, nhưng nó có thể là mã độc khác. Trong những trường hợp này là OK để lưu trữ các cuộc tấn công XSS dựa trên Javascript vào cơ sở dữ liệu?

Tôi chỉ muốn biết các giả định của tôi có đúng không, chúng ta có ổn với việc lưu trữ mã độc trong cơ sở dữ liệu miễn là mã độc không ảnh hưởng trực tiếp đến cơ sở dữ liệu không? Nó là một trường hợp của nó không phải là vấn đề của cơ sở dữ liệu, nó có thể giữ mã độc này và lên đến thiết bị đầu ra để tránh những cạm bẫy của mã độc hại?

Hoặc chúng ta có nên thực hiện thoát nhiều hơn trên đầu vào hơn đề xuất của các hiệu trưởng này không - các mối quan ngại về bảo mật có xuất hiện trước ý tưởng thoát trên đầu ra không? Chúng ta có nên dùng cách tiếp cận mà không có mã độc nào xâm nhập vào cơ sở dữ liệu không? Tại sao chúng tôi muốn lưu trữ mã độc hại?

Cách tiếp cận chính xác để lưu mã độc hại vào cơ sở dữ liệu trong ngữ cảnh của môi trường máy khách/máy chủ web là gì?

[Theo mục đích của việc này tôi bỏ qua bất kỳ trang web mà cụ thể cho phép mã để được chia sẻ trên họ, tôi đang nghĩ đến việc đầu vào "bình thường" như Name, Comment và trường Mô tả.]

Trả lời

7

Định nghĩa: Tôi sử dụng thuật ngữ "khử trùng" thay vì lọc hoặc thoát, vì có tùy chọn thứ ba: từ chối đầu vào không hợp lệ. Ví dụ: trả về lỗi cho người dùng nói rằng "ký tự‽ có thể không được sử dụng trong tiêu đề" ngăn không bao giờ phải lưu trữ nó.

tiết kiệm đầu vào sử dụng như là

Nguyên tắc an ninh "bảo vệ theo chiều sâu" gợi ý rằng bạn nên khử trùng đầu vào bất kỳ độc hại tiềm tàng như sớm và thường xuyên càng tốt. Danh sách trắng chỉ các giá trị và chuỗi hữu ích cho ứng dụng của bạn. Nhưng ngay cả khi bạn làm thế, bạn cũng sẽ phải mã hóa/thoát khỏi các giá trị này.

Tại sao chúng tôi vẫn muốn lưu mã độc?

Có những lúc độ chính xác quan trọng hơn so với hoang tưởng. Ví dụ: phản hồi của người dùng có thể cần bao gồm mã có khả năng gây rối. Tôi có thể tưởng tượng viết phản hồi của người dùng nói rằng "Mỗi khi tôi sử dụng loại %00 là một phần của tiêu đề wiki, ứng dụng gặp sự cố." Ngay cả khi tiêu đề wiki không cần các ký tự %00, nhận xét vẫn nên truyền chính xác chúng. Không cho phép điều này trong ý kiến ​​ngăn cản các nhà khai thác học hỏi về một vấn đề nghiêm trọng.Xem: Null Byte Injection

lên đến thiết bị đầu ra để tránh những cạm bẫy của mã độc hại

Nếu bạn cần lưu trữ dữ liệu tùy ý, cách tiếp cận đúng là để thoát khỏi như bạn chuyển sang bất kỳ loại mã hóa khác . Lưu ý rằng bạn phải giải mã (unescape) và sau đó mã hóa (thoát); không có dữ liệu không được mã hóa như vậy - ngay cả nhị phân cũng ít nhất là Big-Endian hoặc Small-Endian. Hầu hết mọi người đều sử dụng các chuỗi được xây dựng bằng ngôn ngữ như là định dạng 'được giải mã nhiều nhất', nhưng thậm chí nó có thể trở nên khắt khe khi xem xét Unicode vs ASCII. Dữ liệu nhập của người dùng trong các ứng dụng web sẽ được URLEncoded, HTTP được mã hóa hoặc được mã hóa theo tiêu đề "Loại nội dung". Xem: http://www.ietf.org/rfc/rfc2616.txt

Hầu hết các hệ thống hiện thực hiện việc này cho bạn như là một phần của truy vấn khuôn mẫu hoặc tham số hóa. Ví dụ: một hàm truy vấn được tham số hóa như Query("INSERT INTO table VALUES (?)", name) sẽ ngăn chặn việc cần phải thoát khỏi dấu nháy đơn hoặc bất kỳ thứ gì khác trong tên. Nếu bạn không có sự tiện lợi như thế này, nó giúp tạo các đối tượng theo dõi dữ liệu trên mỗi loại mã hóa, chẳng hạn như HTMLString với hàm tạo như hàm NewHTMLString(string)Decode().

Chúng ta có nên sử dụng cách tiếp cận không có mã độc xâm nhập vào cơ sở dữ liệu không?

Vì cơ sở dữ liệu không thể xác định tất cả các mã hóa có thể trong tương lai, nên không thể khử trùng tất cả các mũi tiêm tiềm năng. Ví dụ, SQL và HTML có thể không quan tâm đến backticks, nhưng JavaScript và bash làm.

1

Đầu vào của người dùng này có thể không phải là tấn công SQL injection, nhưng có thể là mã độc khác. Trong những trường hợp này là OK để lưu trữ các cuộc tấn công XSS Javascript dựa vào cơ sở dữ liệu?

thể được OK tùy thuộc vào việc sử dụng hợp cụ thể của bạn. Về mặt lý thuyết, cơ sở dữ liệu nên bất khả tri về việc sử dụng dữ liệu mà nó lưu trữ. Kết quả là, nó sẽ là hợp lý để lưu trữ dữ liệu thô trong cơ sở dữ liệu và thoát chúng trong suốt đầu ra tùy thuộc vào phương tiện đầu ra được sử dụng.

Tôi chỉ muốn biết nếu giả định của tôi ở đây là chính xác, là tất cả chúng ta tốt với lưu trữ mã độc hại trong cơ sở dữ liệu chừng nào mà mã độc hại không trực tiếp ảnh hưởng đến cơ sở dữ liệu? Đây có phải là trường hợp của nó không phải là vấn đề của cơ sở dữ liệu, nó có thể giữ mã độc này và thiết bị đầu ra của nó để tránh những cạm bẫy của mã độc hại ?

Như đã giải thích ở trên, liệu một phần dữ liệu "độc hại" có phụ thuộc nhiều vào ngữ cảnh và cách sử dụng nó hay không. Để đưa ra ví dụ, <script>...</script> là một phần dữ liệu có thể gây ra các vấn đề nghiêm trọng nếu được hiển thị trong trang web HTML. Tuy nhiên, nó có khả năng có thể được coi là một tải trọng hoàn toàn hợp pháp được thể hiện trong một tài liệu/báo cáo in. Đó là lý do đằng sau đề xuất chung về lưu trữ dữ liệu ở dạng thô và loại bỏ chúng tương ứng tùy thuộc vào phương tiện đầu ra. Để trả lời thẳng cho câu hỏi của bạn, có ai có thể tranh luận rằng việc lưu trữ dữ liệu này trong cơ sở dữ liệu là hoàn toàn OK, theo như tất cả các cơ chế thoát được đặt ra cho tất cả các phương tiện có thể.

Hoặc chúng ta nên làm nhiều hơn thoát trên đầu vào hơn được đề xuất bởi những gốc - không những mối quan tâm an ninh đến trước ý tưởng của thoát về sản lượng? Chúng ta có nên sử dụng cách tiếp cận không có mã độc hại vào cơ sở dữ liệu không? Tại sao chúng tôi muốn lưu trữ mã độc hại?

Có sự khác biệt nhỏ giữa vệ sinh và thoát. Trước đây đề cập đến quá trình lọc dữ liệu không hợp lệ trước khi lưu trữ chúng, trong khi thứ hai đề cập đến việc chuyển đổi dữ liệu sang định dạng thích hợp trước khi hiển thị cho phương tiện đã chọn. Theo nguyên tắc phòng thủ sâu, bạn có thể (và bạn nên, nếu có thể) thực hiện thêm một bước vệ sinh khi nhận dữ liệu. Tuy nhiên, để đạt được điều này, điều kiện tiên quyết là bạn phải biết đặc tính của dữ liệu bạn mong đợi. Ví dụ: nếu bạn mong đợi một số điện thoại, thì sẽ có ý nghĩa khi gắn cờ dữ liệu chứa <script> làm dữ liệu không hợp lệ cho người dùng. Điều đó sẽ không nhất thiết phải đúng nếu bạn dự kiến ​​báo cáo cho một bài tập lập trình. Vì vậy, mọi thứ đều phụ thuộc vào ngữ cảnh.

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