获取AJAX调用的ShortCode属性

时间:2018-07-10 作者:DevJoe

我想给我的插件传递一个可以访问文件的文件夹,这样我就可以运行多个设置了不同文件夹的实例。我的第一个想法是用文件夹名添加一个属性。

因为我使用的是AJAX,所以我需要始终访问我的短代码的属性。我找到了这样一种解决方案,将属性传递给JS,然后在发生AJAX调用时将其传回:https://wordpress.stackexchange.com/a/184219

我试过了,但没用。有没有更优雅的方法?

以下是我的PHP文件的重要部分:

add_action(\'init\', \'wporg_shortcodes_init\');
add_action(\'wp_enqueue_scripts\', \'wporg_enqueue_scripts\');

// My global variable for all AJAX processing PHP functions
$scrDir = "";

function wporg_shortcodes_init() {
    add_shortcode(\'wporg\', \'wporg_shortcode\');
}

function wporg_shortcode($atts = [], $content = null) {
    global $srcDir;
    $srcDir = $atts[\'srcdir\']; // Here is the attribute set

    return \'<h1>Hello World</h1>\';
}

function wporg_enqueue_scripts() {
    global $srcDir; // Needs to get right context with \'global\'

    wp_register_script(\'ajaxHandle\', plugin_dir_url(__FILE__) . \'js/main.js\', array(), false, true);
    wp_enqueue_script(\'ajaxHandle\');
    wp_localize_script(\'ajaxHandle\', \'ajax_object\',
        array(
            \'ajaxurl\' => admin_url(\'admin-ajax.php\'),
            \'srcdir\' => $srcDir));
}
这是我从main发出的AJAX调用。js,它将属性传回:

$.ajax({
    url: ajax_object.ajaxurl,
    type: \'POST\',
    data:{
        action: \'search_for_files\',
        data: \'Test data\',
        srcdir: ajax_object.srcdir // Pass attribute back
    },
    success: function(data) {
        console.log("srcdir: " + ajax_object.srcdir); // srcdir is empty although I\'ve set it in wporg_shortcode()
    },
    dataType: "json"
});
下面是shortshode:

[wporg srcdir="myDirectory"]
问题是我的Javascript总是返回一个空的srcdir。这里怎么了?

编辑:中的搜索表达式search_for_files 具有exec 如下所示:

"find " . UPLOAD_FILES_PATH . $srcDir . " -iname \'*" . $filename . "*\' -type f";

1 个回复
最合适的回答,由SO网友:Tom J Nowell 整理而成

问题在于订购。$srcDir 正在正确设置,但将调用设置为wp_localize_script 已经发生了。

相反,请考虑更改代码以引用短代码返回的内容中的数据属性。这还可以防止代码绑定到每页仅允许一个实例。

此外,还有一个重大的安全问题。通过传入文件夹名称,您可以打开网站,使其遭受目录遍历攻击。用户可以制定自己的价值观,包括..\\ 查找文件系统中的任何位置并检索他们想要的任何文件,包括wp-config.php. 然后,他们可以使用这些信息连接到您的数据库,窃取信息或插入自己的信息,例如“您被黑客攻击,发送10000比特币到xxxxx”

此外,您的函数和全局变量非常通用,并且没有前缀,因此如果使用其他插件srcDir 它会发生冲突,打破东西。

我还建议放弃管理AJAX路由,转而使用更易于实现和更安全的WP-restapi

您是否考虑过使用附加文件的自定义帖子类型?WordPress创建类型为attachment 对于上载的文件?你本来可以的attachment 父帖子类型为的文件document 设置这将允许您完全消除对AJAX端点或REST API端点的需要,允许您使用WordPress在/wp-json/wp/v2/etc..

结束