Bạn làm gì khi khách hàng yêu cầu Chỉnh sửa văn bản phong phú trên trang web của họ?


18

Như chúng ta đã biết, các cuộc tấn công XSS rất nguy hiểmthực sự dễ dàng thực hiện . Các khung khác nhau giúp dễ dàng mã hóa HTML, giống như ASP.NET MVC:

<%= Html.Encode("string"); %>

Nhưng điều gì xảy ra khi khách hàng của bạn yêu cầu họ có thể tải lên nội dung của họ trực tiếp từ tài liệu Microsoft Word?

Đây là kịch bản: Mọi người có thể sao chép và dán nội dung từ Microsoft word vào trình soạn thảo WYSIWYG (trong trường hợp này là tinyMCE ), và sau đó thông tin đó được đăng lên một trang web.

Trang web này là công khai, nhưng chỉ các thành viên của tổ chức đó sẽ có quyền truy cập để đăng thông tin lên một trang web.

Làm thế nào để tôi xử lý các yêu cầu này một cách an toàn? Hiện tại không có kiểm tra nào về những gì khách hàng đăng (vì chỉ người dùng 'đáng tin cậy' mới có thể đăng), nhưng tôi không đặc biệt hài lòng với điều đó và muốn khóa nó thêm trong trường hợp tài khoản bị hack.

Phương pháp khái niệm duy nhất mà tôi biết rằng đáp ứng các yêu cầu này là lập danh sách trắng các thẻ HTML và để chúng đi qua . Có cách nào khác không? Nếu không, cách an toàn để cho phép người dùng lưu trữ đầu vào trong Cơ sở dữ liệu dưới bất kỳ hình thức nào, nhưng chỉ hiển thị nó được mã hóa chính xác và tước các thẻ xấu?

Câu hỏi liên quan

Ngăn chặn kịch bản chéo trang web (XSS)


Một câu hỏi hay - đây là một câu hỏi tương tự- stackoverflow.com/questions/445177/
triệt

Đã đồng ý. Nó tương tự, nhưng nó là một câu hỏi khó hiểu (Câu hỏi khó tìm) và nó không hỏi cụ thể nếu có cách nào khác. Nếu có một cách khác để render HTML mà không cần phải Whitelist, tôi là tất cả về nó. Nếu có một ASP.NET MVC View Engine rằng sẽ chăm sóc của điều này, rằng nhân tốt để biết quá.
George Stocker

Trên một lưu ý không liên quan đến bảo mật, các thẻ lọc có thể sẽ hữu ích từ góc độ giao diện người dùng. Rất dễ dàng để vô tình gõ một khung góc và quên thoát nó. Vì chúng ta đang nói về những người dùng đang sao chép từ Word, nên nắm bắt những gì trông giống như các thẻ xấu và mã hóa chúng một cách thích hợp (ví dụ & amp; lt;) để mọi thứ hoạt động.

Về điểm số 4: Bạn đặt cược nó vẫn là một vấn đề! Hầu hết các hack là một công việc bên trong, sau khi tất cả. Đối với một trình soạn thảo cụ thể, tôi đã gặp may mắn khi sử dụng FreeTextBox nhưng tôi không thể nói được mức độ phù hợp với yêu cầu của bạn, đặc biệt là MVC.
Joel Coehoorn

1
@gnat Cảm ơn; chỉnh sửa. Có vẻ như câu hỏi của tôi đã thu hút được sự chú ý của một số loại xe; ba downvote liên tiếp nhanh chóng, và yêu cầu bảo vệ và chỉnh sửa của bạn.
George Stocker

Câu trả lời:


8

Cách dễ nhất (đối với bạn là nhà phát triển) có lẽ là triển khai một trong nhiều biến thể của Markdown , ví dụ Markdown.NET hoặc, thậm chí tốt hơn ( imho ), trình soạn thảo wmd .

Sau đó, người dùng của bạn sẽ có thể dán HTML đơn giản, nhưng không có gì nguy hiểm và họ có thể xem trước dữ liệu đã nhập của họ và làm rõ bất kỳ sự gian lận nào ngay cả trước khi đăng ...


Tôi tin rằng StackOverflow sử dụng trình chỉnh sửa tùy chỉnh mà không cần cú pháp WMD
Jon


Bạn có ý nghĩa gì với cú pháp WMD? Theo như tôi có thể nói, tất cả cú pháp WMD đều hoạt động. Và tôi chưa tìm thấy bất cứ thứ gì không hoạt động ...

2
Vấn đề với việc sử dụng Markdown là việc đánh dấu cho phép HTML tùy ý; Vì vậy, bản thân nó không phải là một giải pháp.
George Stocker

7

Danh sách trắng thực sự là cách tốt nhất để ngăn chặn các cuộc tấn công XSS khi cho phép người dùng nhập HTML, trực tiếp hoặc sử dụng Trình soạn thảo văn bản phong phú.

Về những câu hỏi khác của bạn:

Có trình soạn thảo WYSIWYG bao gồm khả năng lập danh sách trắng khi đang bay không?

Tôi không nghĩ rằng điều này có thể làm việc. Bạn cần mã phía máy chủ cho việc này và RTE chạy trên máy khách.

TinyMCE lọc các thẻ nếu bạn muốn nhưng vì điều này diễn ra trong trình duyệt nên bạn không thể tin tưởng được. Xem Extended_valid_elements . TinyMCE (Moxie) cũng gợi ý danh sách trắng, xem tại đây .

Tôi thậm chí có nên lo lắng về điều này không vì nó chỉ dành cho 'đăng bài riêng tư'

Bạn phải luôn lọc HTML trừ khi có những lý do cụ thể không (rất hiếm). Một số lý do: a) chức năng dành cho người dùng nội bộ hôm nay có thể dành cho công chúng vào ngày mai b) truy cập trái phép sẽ ít ảnh hưởng hơn

cách tốt nhất để cho phép họ lưu trữ nó trong Cơ sở dữ liệu dưới mọi hình thức, nhưng chỉ hiển thị nó được mã hóa đúng và tước các thẻ xấu?

Đó là cách tôi thích nó. Tôi không muốn thay đổi đầu vào của người dùng trước khi chèn vào cơ sở dữ liệu vì nhiều lý do.


-1

Tôi đang làm điều tương tự. Tôi đang sử dụng TinyMCE và cho phép dán từ các tài liệu Word. Chỉ một số người duy trì trang web mới có thể thực hiện việc này thông qua khu vực quản trị viên. Điều này được bảo đảm bởi Thành viên ASP.Net. Tôi đơn giản thực hiện HTML.Encode khi nó được gửi đến trang web công cộng.

Bạn có thể sử dụng mã dưới đây nếu bạn thích trước khi nó được đưa vào cơ sở dữ liệu nhưng không chắc chắn những gì gõ vào ảnh hưởng đến nó sẽ mang lại cho bạn. Bạn có thể phải đi với danh sách trắng của bạn.

 /// <summary>
    /// Strip HTML
    /// </summary>
    /// <param name="str"></param>
    /// <returns></returns>
    public static string StripHTML(string str)
    {
        //Strips the HTML tags from strHTML 
        System.Text.RegularExpressions.Regex objRegExp = new System.Text.RegularExpressions.Regex("<(.|\n)+?>");

        // Replace all tags with a space, otherwise words either side 
        // of a tag might be concatenated 
        string strOutput = objRegExp.Replace(str, " ");

        // Replace all < and > with < and > 
        strOutput = strOutput.Replace("<", "<");
        strOutput = strOutput.Replace(">", ">");

        return strOutput;
    }

Nếu họ lưu trữ văn bản như cảnh báo <script> ("hey") </ script> và bạn thực hiện Html.Encode (<script> alert ("hey") </ script>), nó sẽ chỉ in nó sang trang không chạy cảnh báo
Jon

Tôi không sử dụng danh sách trắng, tôi chỉ lưu trữ như vậy. Các chức năng trên có thể giúp đỡ nhưng tôi không biết những gì gõ vào ảnh hưởng đến nó sẽ có. Muốn biết những gì bạn quyết định. Tại sao bài viết của tôi được đánh dấu là tiêu cực?
Jon

1
Tôi đoán đó là vì cách mà phần mềm của bạn đang thực hiện nó là một triển khai rất ngây thơ; có tất cả các loại thủ thuật sẽ có được xung quanh việc thực hiện của bạn.
George Stocker

4
Danh sách trắng là một ý tưởng tốt, nhưng phương pháp của bạn chắc chắn là không. Regex không phải là một cách đáng tin cậy để phát hiện các thẻ trong văn bản, vì HTML có thể bị xáo trộn. Tốt hơn nhiều để sử dụng một thư viện như Gói Agility HTML.
Noldorin

-1

Một tùy chọn có thể là Điều khiển chỉnh sửa HTML cho .NET (mà tôi đã viết).

Đó là trình soạn thảo HTML WYSIWYM cho .NET, chỉ hỗ trợ một tập hợp con của các phần tử HTML , ngoại trừ <script>các phần tử: vì vậy theo cách đó, nó hoạt động như một danh sách trắng.

Nếu đó là để sử dụng nội bộ (tức là một trang web mạng nội bộ), thì điều khiển có thể được nhúng vào một trang web .

Tôi chưa tích hợp hỗ trợ để dán từ Word, nhưng tôi có một thành phần là một bước theo hướng đó: trình chuyển đổi Doc sang HTML ; vì vậy tôi có các khối xây dựng mà bạn có thể sử dụng trong ASP.NET để chuyển đổi Doc sang HTML, hiển thị HTML trong trình chỉnh sửa, v.v.


-2

IMHO của tôi tiếp tục tin tưởng người dùng của bạn cho đến khi bạn sẽ công khai.

Vâng, không có cách đáng tin cậy để đạt được nhu cầu của bạn. Ví dụ: bất kỳ trình soạn thảo WYSIWYG nào không thể bảo vệ hình thức chèn hình ảnh bằng URL (theo dõi sử dụng gián tiếp, nội dung bất hợp pháp) hoặc văn bản (văn bản bất hợp pháp, văn bản sai chính tả, văn bản bị lỗi).

Quan điểm của tôi là nếu bạn có thể tin tưởng người dùng của mình, chỉ cần cho phép mọi thứ, chỉ cần cảnh báo người dùng nếu có BIẾT đánh dấu nguy hiểm (để giữ cho họ không bị lỗi).

Nếu bạn không tin tưởng, hãy sử dụng loại đánh dấu đặc biệt (ví dụ: Markdown).

Trong dự án của tôi, chúng tôi sử dụng các loại đặc biệt cho nội dung nguy hiểm tiềm tàng và các phương pháp đặc biệt để hiển thị và chấp nhận nội dung đó. Mã này có điểm cao trong mô hình luồng của chúng tôi và sự chú ý đến nó rất cao (ví dụ: mỗi thay đổi cần được xem xét bởi hai lập trình viên độc lập, chúng tôi có bộ kiểm tra toàn diện, v.v.).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.