2013-04-07 42 views
2

我有一個文件輸入前端表格任何人(沒有註冊用戶)可以上傳一個圖像,將附加到一個自定義元字段後端。要預覽圖像,我使用舊的iframe技術。我的形式如下:從前端預覽和發佈圖片與WordPress的安全問題

<form id="upload-photo" method="post" target="preview-iframe" action="<?= get_template_directory_uri() ?>/inc/upload.php" enctype="multipart/form-data" > 
    <div id="preview"><img src="" alt="" /></div> 
    <iframe id="preview-iframe" name="preview-iframe" src=""></iframe> 
    <input type="file" name="author_photo" /> 
    <input type="hidden" id="attachment" name="attachment" value=""/> 
    <button type="submit" id="upload">Upload</button> 
</form> 

然後我使用WordPress內置的函數來處理上傳和文件移動到媒體庫。我使用隱藏字段來存儲附件的WordPress id,因此如果用戶決定通過上傳新圖片來更改圖片,那麼舊圖片將被刪除。這是我的PHP:

<?php 
define('WP_USE_THEMES', false); 
require_once '../../../../wp-load.php'; 
require_once(ABSPATH .'wp-admin/includes/image.php'); 
require_once(ABSPATH .'wp-admin/includes/file.php'); 
require_once(ABSPATH .'wp-admin/includes/media.php'); 

if (isset($_POST['attachment'])) { 
    wp_delete_attachment($_POST['attachment'], true); 
} 

foreach ($_FILES as $file => $data) { 
    if ($data['error'] === UPLOAD_ERR_OK) { 
    $attachment = media_handle_upload($file, null); 
    } 
} 

echo wp_get_attachment_image($attachment, 'author', 0, array('id' => $attachment)); 
?> 

最後jQuery的是膠合一起:

var $preview = $('#preview'), 
    $iframe = $('#preview-iframe'), 
    $attachment = $('#attachment'); 

$('#upload').click(function() { 
    $iframe.load(function() { 
    var img = $iframe.contents().find('img')[0]; 
    $preview.find('img').attr('src', img.src); 
    $attachment.val(img.id); 
    }); 
}); 

一切都運行完美,但也有與這種簡單的方法幾個問題:

  • 如果JavaScript已禁用圖片不會被刪除

  • 如果用戶上傳然後刷新該網站,然後上傳和其他圖像,然後前一個不會被刪除,因爲之前的附件ID由於刷新而不存在。

  • 惡意用戶可以用不同的ID編輯隱藏的attachment字段。

我雖然對上傳文件到/temp文件夾預覽僅供參考,然後運行一個cron作業每X時間空出來。但是,如何在整個表單提交後利用WordPress功能將圖像從/temp移動到圖庫中,以便我可以獲取附件ID並鏈接到該帖子?

請注意,我有兩種形式,一種用於處理圖像,另一種是全球形式,所有內容將會發布,並且已經可以工作,因爲我可以將新帖子發佈爲「草稿」,管理員擁有權力決定。但如何安全地爲圖像做到這一點?如何預覽圖像並將其放入圖庫僅當表單已成功發佈?

我知道FileReader API,但我需要IE8 +的兼容性,所以不會這樣做。我也知道所有的Flash和Silverlight解決方案,但這也不是一種選擇。也請不要只鏈接到WordPress插件,我試圖在這裏學習。

回答

0

好吧,似乎我正在回答我自己的問題。這是我解決它的方式。我發現了一個WordPress功能media_handle_sideload,它允許您從其他位置上傳文件,而不是像上一個功能那樣從$_FILES陣列中上傳文件。

所以我現在用我最初的方法去了解這個功能。我基本上將文件上傳到/temp文件夾進行預覽,併爲其提供一個存儲在隱藏字段中的唯一ID。當用戶提交整個表單並通過驗證時,我會獲取存儲的標識,並確定該文件是否存在,如果存在,我將其移至畫廊。這解決了我對安全問題的大部分擔憂,因爲即使惡意用戶發現了一個現有的唯一ID(不太可能,但可能),該文件也不會像以前那樣被刪除,而只是進入了畫廊(不是什麼大問題)。

最後,我設置了一個cron作業以每X時間清空臨時文件夾。