从wp_EDITOR清理内容

时间:2017-04-07 作者:Gio

我构建了一个自定义的帖子类型,在这里我们可以找到由wp_editor() 我面临着一个关于拯救的问题。

如果使用以下代码保存内容:

update_post_meta( $post_id, $prefix.\'content\', $_POST[\'content\'] );
一切正常,但没有安全措施(消毒、验证等)

如果使用以下代码保存内容:

update_post_meta( $post_id, $prefix.\'content\', sanitize_text_field($_POST[\'content\']) );
我解决了安全问题,但我失去了所有的风格、媒体等。。在内容中。

有什么好方法可以保存应用了所有样式的内容,插入了媒体但包括消毒?

我读了一些关于wp_kses() 但我不知道怎样才能使用好的过滤器。(允许使用公共标签,我应该阻止哪一个?等等)

4 个回复
SO网友:bueltge

简而言之:这取决于您的上下文,即编辑器中的数据。

wp_kses() 非常有用,您可以定义自定义允许的HTML标记。或者,您可以使用默认函数,如wp_kses_postwp_kses_data.这些函数有助于确保从用户接收的HTML只包含白名单中的元素。看见https://codex.wordpress.org/Data_Validation#HTML.2FXML_Fragments

WordPress定义了更多的函数来清理输入,请参见https://codex.wordpress.org/Validating_Sanitizing_and_Escaping_User_Datahttps://codex.wordpress.org/Data_Validation这些页面非常有用。

然而,在您的上下文中wp_kses_post 功能,正确的选择。

SO网友:Melch Wanga

尝试

//save this in the database
$content=sanitize_text_field( htmlentities($_POST[\'content\']) );

//to display, use
html_entity_decode($content);
  1. htmlentities() 将所有具有HTML字符实体等效项的字符转换为其等效项
  2. sanitize_text_field() 然后将检查是否存在无效的UTF-8字符并将其删除。现在可以将其存储在数据库中
  3. html_entity_decode() 将HTML实体转换为其HTML标记等价物

SO网友:Joe

你可以这样做:

/**
 * Most of the \'post\' HTML are excepted accept <textarea> itself.
 * @link https://codex.wordpress.org/Function_Reference/wp_kses_allowed_html
 */
$allowed_html = wp_kses_allowed_html( \'post\' );

// Remove \'<textarea>\' tag
unset ( $allowed_html[\'textarea\'] );

/**
 * wp_kses_allowed_html return the wrong values for wp_kses,
 * need to change "true" -> "array()"
 */
array_walk_recursive(
    $allowed_html,
    function ( &$value ) {
        if ( is_bool( $value ) ) {
            $value = array();
        }
    }
);
// Run sanitization.
$value = wp_kses( $value, $allowed_html );
@fuxia: 正如OP所写:“我读了一些关于wp\\u kses()的文章,但我不知道如何应用好的过滤器。(允许使用公共标记,我应该阻止哪一个?等等)”

wp\\u kses执行以下操作:
“此函数确保在$字符串中只出现允许的HTML元素名称、属性名称和属性值,以及仅出现sane HTML实体。在调用此函数之前,必须从PHP的魔引号中删除任何斜杠。”
https://codex.wordpress.org/Function_Reference/wp_kses

我的代码使用wp_kses 带有“允许通用标记”。常见的标签是什么?可在给定链接中读取的列表。这是一个很长的列表,所以我没有将其粘贴到这里
https://codex.wordpress.org/Function_Reference/wp_kses_allowed_html

我认为textarea本身不应该被允许在textarea中。

@bueltge
wp\\u kses\\u post也会执行相同的操作,只是允许“<;text区域>;\'tag,我认为这不应该
https://core.trac.wordpress.org/browser/tags/4.9.8/src/wp-includes/kses.php#L1575

function wp_kses_post( $data ) {
    return wp_kses( $data, \'post\' );
}

SO网友:Ravi Patel

wp_slash 更多信息。

update_post_meta( $post_id, $prefix.\'content\',wp_slash($_POST[\'content\']) );

相关推荐

第一次提交时WP-EDITOR为空

我在一个简单的插件中使用wp编辑器,但我遇到了一个问题,第一次点击提交按钮时,数据库中的内容是空白的。<?php $editor_id = \'mycontent\'; wp_editor($content, $editor_id ); ?> 因此,我尝试使用以下内容提醒内容:if (j(\".wp-content-wrap\").hasClass(\"tmce-active\")){ alert(