我已经设置了几个WordPress管理AJAX脚本(仅在管理面板中运行),目前它们都使用单独的操作、函数和nonce。
这些脚本之间唯一“真正”的区别是它们的PHP函数。因此,为了简化系统,我编写了1个JS函数和1个主要PHP函数来处理它们。
将发送一个$\\u POST值,并带有指向include的路径。因此,当wp_ajax_custom_func()
运行包含并包装在中的PHP文件locate_template()
It works great, but I am concerned if this creates a security hole?
我知道攻击者可以尝试伪造nonce,向
admin-ajax.php
, XSS/交叉脚本攻击等。。。
我这样假设是因为我已经将include包装在locate_template()
这将有助于保护系统。(当然,长边是SSL、wp\\u verify\\u nonce和current\\u user\\u can)
这是简化的核心概念。
安装程序
wp_enqueue_script( \'ajax_js_class\',
get_template_directory_uri() . \'/theme/ajax_js_class.js\'
);
wp_localize_script( \'ajax_js_class\', \'custom_settings\', array(
\'my_ajaxurl\' => admin_url( \'admin-ajax.php\' )
// nonce and action are attached at the form level
) );
功能
add_action( \'wp_ajax_run_ajax_class_func\', \'run_ajax_class_func\' );
// wp_ajax_nopriv_run_ajax_class_func is not used
function run_ajax_class_func() {
if(isset($_POST[\'nonce\'])) {
$nonce= $_POST[\'nonce\']; // the nonce from the form
$action = $_POST[\'action_hash\']."-special-string"; // changes on each form
$verify_nonce = wp_verify_nonce($nonce, $action);
if( $verify_nonce !== false ) {
if(isset($_POST[\'path\']) && current_user_can(\'administrator\') ) {
$path = $_POST[\'path\']; // <= this is my concern...
include locate_template($_POST[\'path\']);
} else {
$output = json_encode( array( "success" => "false", "message" => "fail") );
}
} else {
$output = json_encode( array( "success" => "false", "message" => "fail") );
}
} else {
$output = json_encode( array( "success" => "false", "message" => "fail") );
}
echo $output; // this is handled in the include above
// always die
die();
}
HTML软件包
<?php $nonce = wp_create_nonce( $random_hash."-special-string" ); ?>
<form>
<input type="hidden" name="path" value="in/theme/run_this.php" >
<input type="hidden" name="nonce" value="<?php echo $nonce; ?>" >
<input type="hidden" name="action_hash" value="<?php echo $random_hash; ?>" >
本地化Js Essentials
$.post(custom_settings.my_ajaxurl, data, function(response) {
我曾试图攻击表单(使用Fiddler2修改标题和帖子数据),但怀疑我存在确认偏差。
我想咨询社区,看看这个想法是好是坏。(坏主意当然值得批评)
Questions:
- If I have secured the wp_ajax function (according to WordPress best practices) is it OK to use POST data to include a file within the WP Admin AJAX action?
- Am I making it easier for attackers to abuse the system?
- Is this creating an unnecessary back door in the system just to avoid writing several additional functions, ie: is it lazy?最后,如果将每个nonce、enqueue、form和action创建为完全独立的脚本更安全,请详细说明原因。
参考和研究:
最合适的回答,由SO网友:Krzysiek Dróżdż 整理而成
如果正确使用nonce,则无法使站点处理假请求。。。所以这部分应该是安全的,但是。。。您的方法中仍然存在一个安全缺陷。。。
如果我可以让您在浏览器中运行我的JS脚本,而您以管理员身份登录,该怎么办?这是可能的。
这样,nonce不会导致验证错误,您的代码将执行我想要的任何内容-因为您不验证来自用户的输入。。。
所以你所有的安全性都是基于向你的站点注入一些JS的可能性——这很常见——只要看看WP中的恶意软件历史就可以了。。。
如果模板是基于已验证的数据加载的,则会更加安全。所以,不要直接加载它,而是列出正确、安全的模板列表,并根据POST中发送的变量加载它们。
回到你的3个问题:
1。如果我已经保护了wp\\u ajax功能(根据WordPress最佳实践),那么可以使用POST数据在wp Admin ajax操作中包含文件吗
否。根据用户发送的路径加载任何文件都是不可能的。如果您传递一个变量,然后将该变量转换为PHP中文件的路径,则会更加安全。
2。我是否使攻击者更容易滥用系统
您并没有让它变得更简单,但是是的-有可能攻击此类代码。
3。这是不是在系统中创建了一个不必要的后门,只是为了避免编写几个额外的函数,例如:它是懒惰的
是的。但您不必编写多个函数。您只需妥善保护这一点,并记住-您永远不应该信任来自用户的任何东西。