Wp_kses $ được phép


9

Tôi có một hộp văn bản bài tùy chỉnh mà tôi muốn vệ sinh bằng cách sử dụng wp_ksestrước khi tôi cập nhật meta bài đăng của mình.

Tôi đã tìm kiếm các ví dụ về các $allowedcài đặt phổ biến , nhưng tôi chỉ thấy ví dụ này:

$allowed = array(  
        'a' => array( // on allow a tags  
            'href' => array() // and those anchors can only have href attribute  
        )  
    );  

Một wp_kses $allowedthiết lập điển hình là gì? Ai đó có thể cung cấp một ví dụ về những gì họ thường lọc?


Câu hỏi này nằm ngoài phạm vi của trang web vì có nhiều hơn một câu trả lời đúng. Nếu bạn thu hẹp phạm vi câu hỏi, hãy trình bày trường hợp sử dụng và yêu cầu ai đó cung cấp cho bạn những thứ bạn nên đưa vào sẽ tốt hơn nhiều.
mor7ifer

Tôi muốn có một hộp văn bản phong phú, nơi người dùng chỉ có thể nhập văn bản thông thường, in đậm, liên kết, in nghiêng ...
thức lại vào

Câu trả lời:


7

Tôi sẽ không đồng ý với giải pháp được đăng bởi @JaredCobb, wp_kses()linh hoạt hơn nhiều so với phương pháp mà ông đã trình bày. Nó có thể loại bỏ các thuộc tính không mong muốn khỏi các thẻ mà không tự hủy các thẻ. Ví dụ: nếu người dùng đưa vào <strong class='foo'>, wp_kses()sẽ trả về <strong>nếu bạn không cho phép lớp, trong khi đó strip_tags()sẽ xóa <strong>hoàn toàn.

@redconservatory: Các thuộc tính bạn muốn sử dụng như sau:

$args = array(
    //formatting
    'strong' => array(),
    'em'     => array(),
    'b'      => array(),
    'i'      => array(),

    //links
    'a'     => array(
        'href' => array()
    )
);

Điều này sẽ cho phép in đậm và in nghiêng không có thuộc tính, cũng như các thẻ neo với hrefthuộc tính ... và không có gì khác. Nó sử dụng nguyên tắc danh sách trắng, mà @jaredcobb lưu ý đúng là cách tốt hơn để đi đến đây.


Bạn không thể nói với các thẻ dải những thẻ được phép? php.net/manual/en/function.strip-tags.php
redconservatory

Mặc dù, tôi vẫn có thể thấy wp_kses tốt hơn như thế nào bây giờ khi tôi có thể thấy cách nó loại bỏ các lớp không mong muốn ...
phát hiện lại vào

Tôi có lẽ đã không giải thích rõ ràng ... Nhưng vâng, wp_ksescho phép kiểm soát nhiều hơn các tùy chọn PHP gốc. Tôi nghĩ rằng tôi đã nói rằng. Tôi cũng đã sử dụng từ "thuộc tính". Tôi đã nói nó phụ thuộc vào trường hợp sử dụng của bạn. Ai đó đang cố gắng bảo vệ dữ liệu của họ khỏi tất cả các thẻ sẽ tốt hơn khi sử dụng dải phân cách IMHO nhưng đó là sở thích của tôi hơn bất kỳ thứ gì khác. Chúc mừng.
Jared Cobb

7

Tôi sẽ bắt đầu với cùng một $allowedtagsmảng mà WordPress sử dụng cho ý kiến ​​của họ. Bạn có thể tìm thấy mảng của họ trong [wordpress directory]/wp-includes/kses.phptập tin. Chúng có vẻ như mặc định hợp lý với tôi, và một điểm khởi đầu tốt. Đây là mảng của họ ...

$allowedtags = array(
    'a' => array(
        'href' => true,
        'title' => true,
    ),
    'abbr' => array(
        'title' => true,
    ),
    'acronym' => array(
        'title' => true,
    ),
    'b' => array(),
    'blockquote' => array(
        'cite' => true,
    ),
    'cite' => array(),
    'code' => array(),
    'del' => array(
        'datetime' => true,
    ),
    'em' => array(),
    'i' => array(),
    'q' => array(
        'cite' => true,
    ),
    'strike' => array(),
    'strong' => array(),
);

Tôi sẽ KHÔNG sử dụng PHP strip_tagsđể thay thế wp_kses.

Bạn không bao giờ nên sử dụng Strip_tags để lọc nội dung không xác định của người dùng!

Tôi đã tạo một video nhanh chóng giải thích lý do tại sao WordPress 'wp_kses () tốt hơn so với thoát khỏi dải bảo mật của PHP .


Xin chào, những gì về & nbps
Leditesh VM Villa

2

Tôi đã chỉ được sử dụng wp_kseskhi tôi đã đặc biệt cần thiết để cho phép / lọc các thuộc tính của thẻ HTML (ví dụ, tôi muốn họ được phép có một <image>thẻ với một src=""thuộc tính nhưng tôi không muốn họ để có thể nhưng href=""hay style=""hoặc bất cứ điều gì khác trên thẻ hình ảnh. Trong trường hợp đó, wp_ksescó ích vì (như bạn có thể thấy trong ví dụ bạn đã tạo), bạn có thể lọc rất cụ thể. Tôi hiếm khi sử dụng wp_ksesvì tôi chỉ thấy rằng một vài PHP gốc các hàm (bên dưới) thực hiện thủ thuật và dễ hiểu hơn khi tôi xem mã vài tháng sau đó.

Nếu bạn muốn xóa hoàn toàn các thẻ HTML (ngoại trừ có thể cho phép một vài) thì tôi luôn sử dụng strip_tags. Bạn có thể chuyển qua một chuỗi các thẻ được phép (như <p> <br> <strong>) hoặc bất kỳ thẻ vô hại nào khác mà bạn thích. Điều này cho phép người dùng có thể có một số kiểm soát về định dạng, nếu điều đó phù hợp với trường hợp sử dụng của bạn. Tôi thích strip_tagsbởi vì nó có một cách tiếp cận danh sách trắng để vệ sinh dữ liệu của bạn. (Có nghĩa là tất cả mọi thứ bị tước bỏ ngoại trừ những gì bạn rõ ràng trong danh sách trắng).

Nếu mục tiêu của bạn là cho phép họ đưa bất kỳ HTML nào vào nội dung, nhưng bạn chỉ muốn hiển thị văn bản của họ khi họ nhập nó (như ví dụ mã) thì hãy sử dụng htmlspecialchars. Điều này sẽ chuyển đổi các ký tự HTML thành các bản sao được mã hóa của chúng để bạn có thể xuất nó ra trang một cách an toàn.

Bạn có thể bắt gặp mã bằng cách sử dụng str_replace"ngoại hình" cho các thẻ xấu như hoặc bất cứ thứ gì. Tôi thực sự không khuyến nghị cách tiếp cận đó vì nó cần một cách tiếp cận danh sách đen để vệ sinh dữ liệu và bạn phải liên tục đảm bảo danh sách đen của mình được cập nhật.

Tôi đoán để tóm tắt, nó phụ thuộc vào metaboxes của bạn được sử dụng để làm gì. Nếu bạn đang bảo vệ chống lại đầu vào từ người dùng (có thể là độc hại), tôi khuyên bạn nên strip_tagsvà chỉ cho phép một số thẻ vô hại. Nếu bạn có một trường hợp kinh doanh tốt để thực sự quản lý các thẻ và thuộc tính cụ thể của nội dung của người dùng , use wp_kses.


Không wp_kses()làm mọi thứ mà strip_tags()còn hơn thế nữa? Tôi là tất cả để giữ cho mọi thứ đơn giản, nhưng tôi cũng nghĩ rằng có một cuộc tranh luận không "làm ngạc nhiên" bất cứ ai. wp_kses()là "cách Wordpress" và vì chúng tôi đang viết mã Wordpress, có một lập luận rằng đó có lẽ là sự lựa chọn tốt hơn. Ngoài ra, nếu tại một thời điểm nào đó trong tương lai, chúng tôi muốn đưa vào danh sách trắng các kết hợp thẻ / thuộc tính nhất định, sử dụng wp_kses()ngay từ đầu không yêu cầu cấu trúc lại.
rinogo

2

Có bạn đi. Điều này hoạt động cả trong WordPress và bên ngoài WordPress.

<?php

$str = '     I am <strong>stronger</strong> and cooler every single day <aaaaa>.    ';
echo orbisius_html_util::strip_tags($str);

/**
 * Util HTML class
 * @author Svetoslav Marinov (SLAVI) | http://orbisius.com
 */
class orbisius_html_util {
    /**
     * Uses WP's wp_kses to clear some of the html tags but allow some attribs
     * usage: orbisius_html_util::strip_tags($str);
     * uses WordPress' wp_kses()
     * @param str $buffer string buffer
     * @return str cleaned up text
     */
    public static function strip_tags($buffer) {
        static $default_attribs = array(
            'id' => array(),
            'class' => array(),
            'title' => array(),
            'style' => array(),
            'data' => array(),
            'data-mce-id' => array(),
            'data-mce-style' => array(),
            'data-mce-bogus' => array(),
        );

        $allowed_tags = array(
            'div'           => $default_attribs,
            'span'          => $default_attribs,
            'p'             => $default_attribs,
            'a'             => array_merge( $default_attribs, array(
                'href' => array(),
                'target' => array('_blank', '_top'),
            ) ),
            'u'             =>  $default_attribs,
            'i'             =>  $default_attribs,
            'q'             =>  $default_attribs,
            'b'             =>  $default_attribs,
            'ul'            => $default_attribs,
            'ol'            => $default_attribs,
            'li'            => $default_attribs,
            'br'            => $default_attribs,
            'hr'            => $default_attribs,
            'strong'        => $default_attribs,
            'blockquote'    => $default_attribs,
            'del'           => $default_attribs,
            'strike'        => $default_attribs,
            'em'            => $default_attribs,
            'code'          => $default_attribs,
        );

        if (function_exists('wp_kses')) { // WP is here
            $buffer = wp_kses($buffer, $allowed_tags);
        } else {
            $tags = array();

            foreach (array_keys($allowed_tags) as $tag) {
                $tags[] = "<$tag>";
            }

            $buffer = strip_tags($buffer, join('', $tags));
        }

        $buffer = trim($buffer);

        return $buffer;
    }
}

Xin chào, ông Svetoslav, điều này vào thời điểm này có còn an toàn không? Tôi đã tìm kiếm một cách đơn giản nhưng an toàn để vệ sinh đầu vào của người dùng vào backoffice của tôi (không có Wordpress). Tôi chỉ muốn cho phép sử dụng định dạng html cơ bản như trong mã của bạn, <b>, <I>, < u>. Bạn có nghĩ rằng tôi có thể sử dụng cái này như là dải phân cách ($ _ POST ['myDoc']) hay bạn nghĩ tôi nên làm gì khác để an toàn? Cảm ơn vì sự giúp đỡ!
Pluda

Xin chào, sử dụng mã của tôi. Nó kiểm tra nếu nó chạy trong bối cảnh WordPress sẽ sử dụng chức năng WP nếu không sẽ chuyển sang php Strip_tags. Ngoài ra, tốt hơn là sử dụng $ _REQUEST thay vì $ _POST vì tại một số điểm bạn có thể truyền dữ liệu dưới dạng tham số GET.
Svetoslav Marinov

cảm ơn đã trả lời :-). Bây giờ tôi đang phải vật lộn với một vấn đề ... nếu tôi dán định dạng html hoặc mỗi ví dụ một số mã từ văn bản cao siêu 3 phần lớn văn bản bị thiếu, phải có một số mã được định dạng ẩn phá vỡ tập lệnh.
Pluda

có thể là một vấn đề mã hóa utf8
Svetoslav Marinov

Có thể, tôi đang dọn dẹp html như tôi đã đăng trong câu trả lời ở trên, tìm kiếm \ n, \ r, v.v. nhưng vấn đề vẫn còn đó :-(. Làm sạch dữ liệu đã dán có thể là một vấn đề lớn, một số Cách đây nhiều năm, tôi đã sử dụng bản sao dán vào textedit để làm sạch các chuỗi đã sao chép, nhưng tôi không thể hy vọng người dùng của mình sẽ làm như vậy.
Pluda


0

@Svetoslav Marinov

Tôi đã thêm mã này ngay sau $ buffer = trim ($ buffer);

    $string_limpa = array(
                '<div><p><\/div>' => '<br>',
                '<div><br><\/div>'=> '<br>',
                '<div align="left"><br><\/div>' => '<br>',
                '<div align="center"><br><\/div>' => '<br>',
                '<div align="right"><br><\/div>' => '<br>',
                '<div style="text-align: left;"><br><\/div>' => '<br>',
                '<div style="text-align: center;"><br><\/div>' => '<br>',
                '<div style="text-align: right;"><br><\/div>' => '<br>',
                '<div style="text-align: justify;"><br><\/div>' => '<br>',
                'class="Apple-style-span"' => '<br>',
                '<p><br></p>' => '<br>',
                '<p><b></p>' => '<br>',
                '<p><i></p>' => '<br>',
                '<p><u></p>' => '<br>',
                '\r' => '<br>',
                '\n' => '<br>',
                '\t' => ' ',
                '\0' => ' ',
                '\x0B' => '<br>',
                '<p style="text-align: center;"><br></p>' => '<br>'
            );
    return strtr($buffer, $string_limpa);

để cố gắng làm sạch html và tránh dán các ký tự ẩn mã phá vỡ, nhưng nó không hoạt động, nó làm sạch html, nhưng các ký tự ẩn vẫn còn.

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.