清理来自wp_editor的内容


8

我建立了一个自定义帖子类型,在其中可以找到由生成的标准textarea / tinymce,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()但是我不知道如何应用好的过滤器。(允许使用通用标签,我应该阻止哪一个?等。)


通常,仅在名称中随机应用带有“ sanitize”的功能可能不会清除并且可能不会增加安全性。没有完整的上下文就不可能谈论安全性,但是一般而言,您可能应该使用其中一个wp_kses
马克·卡普伦

在转换值之前尝试使用wp_slash($ value)函数。
拉维·帕特尔18-3-6

Answers:


4

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

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功能应该是正确的选择。


3

尝试

//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标签

2
请解释为什么原始海报应使用这些功能。
Max Yudin

如果您使用wp_editor(),并且想在自己的数据结构中保存$ _POST ['youreditor']和其他选项,那就是这种方式。.我还添加了wp_kses_post()
Nissar

1

您可以这样做:

/ **
 *大多数“发布” HTML均不接受<textarea>本身。
 * @link https://codex.wordpress.org/Function_Reference/wp_kses_allowed_html
 * /
$ allowed_html = wp_kses_allowed_html('post');

//删除'<textarea>'标签
未设置($ allowed_html ['textarea']);

/ **
 * wp_kses_allowed_html返回wp_kses的错误值,
 *需要更改“ true”->“ array()”
 * /
array_walk_recursive(
    $ allowed_html,
    函数(&$ value){
        如果(is_bool($ value)){
            $ value = array();
        }
    }
);
//运行消毒。
$ value = wp_kses($ value,$ allowed_html);

@fuxia:正如OP所写:
“我对wp_kses()有所了解,但我不知道如何应用良好的过滤器。(允许使用通用标签,应该阻止哪个标签?等等。”)

wp_kses执行以下操作:
“此函数确保$ string中仅出现允许的HTML元素名称,属性名称和属性值以及仅健全的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_kses_post做同样的事情,除了允许'<textarea>'标签,我认为-不应该这样。
https://core.trac.wordpress.org/browser/tags/4.9.8/src/wp-includes/kses.php#L1575

函数wp_kses_post($ data){
    返回wp_kses($ data,'post');
}

0

wp_slash更多信息。

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

不应将其用于转义直接进入SQL查询的数据。从Wordpress。
bilimokur
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.