如何使WordPress安全的文件下载系统


How to make WordPress secure file download system

我正在创建一个wordpress插件,用于备份wordpress数据库,并允许用户下载备份文件,而无需将其保存在服务器上。我试图通过ajax来实现(强制下载)。所以我做了如下的事情,

function downloadURL(url) {
                var hiddenIFrameID = 'hiddenDownloader',
                    iframe = document.getElementById(hiddenIFrameID);
                if (iframe === null) {
                    iframe = document.createElement('iframe');
                    iframe.id = hiddenIFrameID;
                    iframe.style.display = 'none';
                    document.body.appendChild(iframe);
                }
                iframe.src = url;
            }
   var url_encode=encodeURIComponent('<?php echo plugins_url()."/link-to-process.php?save_to_disk=true"; ?>');
downloadURL(decodeURIComponent(url_encode));

这段代码直接访问process.php文件进行强制下载。process.php中包含一些wordpress代码。

我的进程.php代码

if(!empty($_REQUEST['save_to_disk'])) {
header("Content-disposition: attachment;filename=".$file);
header("Content-type: application/txt");
require_once('../../../wp-load.php');
$pre=$wpdb->prefix;
$arr=array($pre.'users',$pre.'usermeta',$pre.'terms',$pre.'term_taxonomy',$pre.'term_relationships',
    $pre.'posts',$pre.'postmeta',$pre.'options',
    $pre.'options',$pre.'links',$pre.'comments',$pre.'commentmeta' );
$imp=implode(",", $arr);
$exp=explode(",",$imp);
$mybackup = backup_tables(DB_HOST,DB_USER,DB_PASSWORD,DB_NAME,$exp);
echo $mybackup;
}

因此,我的技术是有一个jQuery文件,它访问一个php文件,该文件处理并允许用户下载该文件。

但我的问题是:任何人都可以在没有jQuery文件的情况下做到这一点(如果安装了这个插件)。比如,如果有人在浏览器中输入此url

localhost/wordpress/wp-content/plugins/plugins-name/process-file-name.php?save_to_disk=true

则将下载备份文件。所以这是一个危险的安全问题。因为任何人都可以点击这个网址下载wordpress数据库信息。

那么我现在该怎么办呢?有什么方法可以安全地下载这个文件吗?

注意:如果我阻止通过jQuery直接访问强制下载,那么强制下载就不起作用,我只想下载(而不是保存在服务器上)。

在wordpress中执行这类操作的正确方法是使用nonce字段来检查refferer。Nonce字段是wordpress用来检查请求完整性的唯一字段。因此,每次有人进入表单时,该字段都会自动填充为隐藏字段,其值每次都会更改。当这个请求进入处理文件时,wordpress有一些功能可以检查nonce是否有效。

Nonce也可以与ajax一起使用,请查看以下教程http://codex.wordpress.org/Function_Reference/check_ajax_refererhttp://manofhustle.com/2013/06/18/how-to-add-a-wordpress-ajax-nonce/