【问题标题】:Is it risky to use wp_update_post with AJAX to send large blocks of HTML?使用带有 AJAX 的 wp_update_post 发送大块 HTML 是否有风险?
【发布时间】:2021-09-11 01:58:53
【问题描述】:

我正在创建一个使用 AJAX 更新页面内容的前端编辑器。

它通过使用 JS 进行更新,以获取 HTML 组件的块并保存到页面内容,包裹在 <!-- wp:html --> 标记中。

该功能仅在用户登录并选择前端编辑器选项(自定义主题选项)时可用。

AJAX 代码是:

function scedPage(post_id) {
    var pageComs = ["<!-- wp:html -->"];
    jQuery('section component').each(function () {
        $this0 = jQuery(this)[0].outerHTML;
        pageComs.push($this0);
    
    });
    pageComs.push("<!-- /wp:html -->");
    pageHtml = pageComs.join(' ');
    console.log(pageHtml);
    jQuery.ajax({
        type: "POST",
        url: ajax_object.ajaxurl,
        async: true,
        data: {
            action: 'sced_page',
            post_content: pageHtml,
            postId: post_id
        },
        success: function (data) {
            location.reload();
        },
        error: function (error) {
            console.log(error)
        }
    });
};

PHP 是:

function sced_page() {
    $dev_sced = get_option('scale_opt_field2');
    if (current_user_can('editor') || current_user_can('administrator')) {
        if ($dev_sced !== "1") {
        } else if ($dev_sced == "1") {
            $post_id = $_POST['postId'];
            $post_content = $_POST['post_content'];
    
            $the_post = array();
            $the_post['ID'] = $post_id;
            $the_post['post_content'] = $post_content;
    
            $post_id = wp_update_post($the_post);
            wp_die();
            add_action( 'wp_ajax_sced_page', 'sced_page' );
        }
    }
};

发布大块未转义/未过滤的 HTML 是否会造成问题? 我意识到我需要在其中添加随机数。

感谢您的帮助。

【问题讨论】:

    标签: javascript php ajax wordpress


    【解决方案1】:

    发布大块未转义/未过滤的 HTML 是否会造成问题?

    TLDR;

    是的,您的代码有可能被恶意用户利用,因此我会在将用户输入保存到数据库之前(或在网站上呈现内容之前)使用 wp_kses_posts() 清理用户的输入。


    由于您正在检查用户能力并期望他们是编辑或管理员,这些角色通常分配给您信任的人,因此理论上将他们提交的任何内容保存到数据库中可能听起来不错.

    虽然经验教会了我——许多其他人肯定会说同样的话——你永远不应该相信用户的输入。尽可能清理/转义数据。将此作为开发人员的个人口头禅,并为您的未来自我省去一些麻烦。

    $post_content = wp_kses_post($_POST['post_content']);
    

    与您的原始问题无关,但如果可以的话,想指出一些关于您的代码的事情:

    • 您的第一个if 条件没有执行任何操作。那是不完整的代码还是...?
    • 这个add_action( 'wp_ajax_sced_page', 'sced_page' ); 永远不会被执行:wp_die(); 之后的任何东西都不会被服务器运行。
    • 在尝试访问之前,您应该检查$_POST['postId']$_POST['post_content'] 是否使用isset() 设置。
    • 是的,使用 nonce 是个好主意:P

    【讨论】:

    • 感谢您的回复。如果我将页面内容更新为仅 HTML 块,“wp_kses_post”会去除 HTML 标签吗?并回答您的其他问题: - 第一个“if”语句是多余的,我将其留在其中的错误...... - 谢谢我会修改它,以便“add_action”是可执行的 - 我感谢代码改进 cmets!
    • wp_kses_post() 只会删除可能被滥用的 HTML 标记(和属性)(例如 &lt;script&gt;...&lt;/script&gt;),而保留其余部分(例如 img 标记、段落等)。查看我在上面分享的链接了解更多详情。
    猜你喜欢
    • 2016-07-08
    • 2018-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-09
    • 2013-08-04
    • 2010-09-30
    • 1970-01-01
    相关资源
    最近更新 更多