我想给我的插件传递一个可以访问文件的文件夹,这样我就可以运行多个设置了不同文件夹的实例。我的第一个想法是用文件夹名添加一个属性。
因为我使用的是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";
最合适的回答,由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..