Sự khác biệt giữa bộ lọc esc_html so với bộ lọc property_escape là gì?


8

Sự khác biệt chính xác giữa esc_htmlattribute_escapebộ lọc là gì?

esc_html()sử dụng esc_html filteresc_attr()sử dụng attribute_escape filter. Cả hai mã hóa <> & "'(ít hơn, lớn hơn, dấu và, trích dẫn kép, trích dẫn đơn).

Tôi muốn biết chính xác điều gì làm cho chúng khác biệt về mặt bảo mật (thoát).


tốt, nếu chúng không khác nhau thì sẽ không cần có hai người .... câu hỏi IMO không rõ ràng, giống như hỏi sự khác biệt giữa bộ lọc_content và the_excerpt
Mark Kaplun

1
Tôi nghĩ đó là những gì anh ấy hỏi, chúng khác nhau như thế nào và tại sao?
Tom J Nowell

@TomJNowell, một cái được gọi để thoát các thuộc tính và cái còn lại để thoát HTML chung. Điều đó giải thích lý do tại sao, và chủ yếu giải thích như thế nào;) Câu trả lời nên bắt đầu từ đâu ở đây, với việc giải thích sự khác biệt giữa các ký tự được cho phép trong các thuộc tính và html chung? Điều này nghe có vẻ hơi quá cơ bản (nhưng có thể là những gì OP hỏi về tôi đoán)
Mark Kaplun

2
Điều đó sẽ tốt, nhưng một ví dụ về một thứ gì esc_attrđó esc_htmlkhông hữu ích, sau đó tại sao không sử dụng esc_htmlở mọi nơi? Nếu nó rõ ràng đối với bạn thì nó có vẻ không phải là một câu hỏi hay nhưng không rõ ràng đối với người hỏi rằng hai chức năng này khác nhau như thế nào khi cả hai đều thoát khỏi các nhân vật được mong đợi
Tom J Nowell

Câu trả lời:


8

Có vẻ như ra khỏi hộp, không có sự khác biệt

function esc_html( $text ) {
    $safe_text = wp_check_invalid_utf8( $text );
    $safe_text = _wp_specialchars( $safe_text, ENT_QUOTES );
    /**
     * Filters a string cleaned and escaped for output in HTML.
     *
     * Text passed to esc_html() is stripped of invalid or special characters
     * before output.
     *
     * @since 2.8.0
     *
     * @param string $safe_text The text after it has been escaped.
     * @param string $text      The text prior to being escaped.
     */
    return apply_filters( 'esc_html', $safe_text, $text );
}
function esc_attr( $text ) {
    $safe_text = wp_check_invalid_utf8( $text );
    $safe_text = _wp_specialchars( $safe_text, ENT_QUOTES );
    /**
     * Filters a string cleaned and escaped for output in an HTML attribute.
     *
     * Text passed to esc_attr() is stripped of invalid or special characters
     * before output.
     *
     * @since 2.0.6
     *
     * @param string $safe_text The text after it has been escaped.
     * @param string $text      The text prior to being escaped.
     */
    return apply_filters( 'attribute_escape', $safe_text, $text );
}

Sự khác biệt duy nhất giữa 2 chức năng là bộ lọc được áp dụng ở cuối. WordPress không thêm bất cứ thứ gì vào các bộ lọc này, vì vậy trong bản cài đặt WP tiêu chuẩn, chúng không hoạt động. Họ được cung cấp trong trường hợp cạnh mà ai đó có thể cần chúng.

Hỏi đáp nhanh

Vậy mặc định chúng giống hệt nhau?

Đúng! Các chức năng esc_attresc_htmlcó cùng thực hiện

Các bộ lọc có giống nhau không?

Sự khác biệt duy nhất là chúng có các tên khác nhau, chúng hoạt động theo cùng một cách, chúng được sử dụng theo cùng một cách và không có bộ lọc nào được sử dụng trong lõi.

Làm các bộ lọc làm bất cứ điều gì?

Không! Tất cả các thoát được thực hiện trong chức năng khi wp_check_invalid_utf8_wp_specialcharsđược gọi.

Các bộ lọc không thực hiện thoát, chúng là cơ hội để các plugin thực hiện kiểm tra và xử lý bổ sung.

Có trường hợp cạnh?

Chỉ khi bạn sử dụng các bộ lọc, hãy nói rằng bạn đã nối vào esc_htmlnhưng không attribute_escapehoặc ngược lại. Đối với cài đặt WP tiêu chuẩn, 2 chức năng giống hệt nhau, không có sự khác biệt.

Tại sao attribute_escapevà không esc_attr?

Tương thích ngược. Đã từng có một attribute_escapehàm, hiện được đánh dấu là không dùng nữa sau khi các esc_hàm kiểu được thêm vào.

Tại sao tôi nên sử dụng các bộ lọc này?

¯\_(ツ)_/¯đây sẽ là một tình huống hiếm gặp Một số người có thể lạm dụng nó theo cùng cách API dịch thuật bị lạm dụng để tìm kiếm văn bản thay thế. Đây là một thực tế tồi tệ vì những bộ lọc đó được gọi là rất nhiều sự mất tốc độ nhỏ được phóng to hàng ngàn lần

Nhưng hãy cân nhắc rằng nếu bạn không cẩn thận, bạn có thể làm tổn hại đến tính bảo mật của các chức năng này bằng cách hoàn tác việc thoát mà họ đã thêm hoặc thêm nội dung không được giải quyết vào cuối. Vì lý do đó các bộ lọc là nguy hiểm.

Tôi có cần phải lo lắng về điều này?

Không. Bạn chỉ cần lo lắng nếu bạn đã sử dụng các bộ lọc đó, chính nó đã đặt ra các báo động đỏ khổng lồ rằng có gì đó trong quá trình phát triển của bạn đã sai nghiêm trọng.

Các chức năng esc_attresc_htmlan toàn để sử dụng, và thoát nội dung. Bạn có nghĩa vụ đạo đức và đạo đức để sử dụng chúng nếu bạn coi trọng tính bảo mật của mã của bạn

Điều này có nghĩa là tôi chỉ nên sử dụng esc_html?

Không, thoát là tất cả về thiết lập kỳ vọng. Nếu bạn đang mong đợi một thuộc tính, sử dụng esc_attr. Chỉ vì nó hoạt động giống nhau vào lúc này, không có nghĩa là sẽ không thay đổi trong tương lai với bản phát hành bảo mật


Cảm ơn câu trả lời. Có lẽ tôi cần phải viết lại câu hỏi của mình. Tôi quan tâm hơn để biết liệu có sự khác biệt nào trong việc triển khai cốt lõi của hai bộ lọc được đề cập ở trên không. Điều này thực sự sẽ giúp chúng tôi (nhà phát triển) biết cách thoát hoạt động trong các thuộc tính và HTML.
djadmin

Những bộ lọc đó không được Core sử dụng, chúng được cung cấp cho các plugin nếu cần. Tuy nhiên, tôi khuyên bạn không nên sử dụng chúng vì lý do bảo mật
Tom J Nowell

"Do đó, các bộ lọc esc_html và property_escape rất nguy hiểm." Tôi thực sự không hiểu điểm này. Nếu chúng ta không sử dụng điều này, thì chúng ta phải làm thế nào để thoát khỏi đầu vào của người dùng để ngăn chặn XSS?
djadmin

Như bạn đã nói, họ đi qua một bộ lọc trước khi thoát. Câu hỏi ban đầu của tôi là hai bộ lọc này khác nhau như thế nào về mặt triển khai. Tôi tin rằng sẽ có một số trường hợp cạnh mà esc_htmlbộ lọc thoát và attribute_escapebộ lọc không hoặc ngược lại.
djadmin

Họ không. Các bộ lọc được cung cấp cho mã bên thứ 3 và không được Core sử dụng. Core không kết nối với các bộ lọc và cũng không làm gì với chúng. Những trường hợp cạnh đó sẽ cần được viết bởi một nhà phát triển chủ đề hoặc plugin, tại thời điểm đó rõ ràng vì bạn là người đã viết nó
Tom J Nowell
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.