我正在创建一个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代码。
我的process.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文件(如果安装了此插件),任何人都可以这样做。比如,如果有人在浏览器中输入此网址
localhost/wordpress/wp-content/plugins/plugins-name/process-file-name.php?save_to_disk=true
然后将下载备份文件。所以这是一个危险的安全问题。 因为任何人都可以通过点击这个URL来下载wordpress数据库信息。
那我现在该怎么办?有没有办法以安全的方式下载文件?
注意:如果我通过jQuery阻止直接访问强制下载,那么强制下载不起作用,我只想下载(不要将其保存在服务器上)。
答案 0 :(得分:0)
在wordpress中执行此类操作的正确方法是使用nonce字段来检查refferer。 Nonce字段是wordpress用于检查请求完整性的唯一字段。因此,每当有人进入表单时,此字段将自动填充为隐藏字段,其值将随时更改。当此请求进入处理文件时,wordpress有一些函数可以检查nonce是否有效。
Nonce也可以与ajax一起使用,结帐这些教程 http://codex.wordpress.org/Function_Reference/check_ajax_referer http://manofhustle.com/2013/06/18/how-to-add-a-wordpress-ajax-nonce/