MW WP Formのファイルアップロードについて
2020.01.06 2020.01.10
セキュリティ対策
MW WP Formを使ったファイルのアップロードでは、ログインしていなくてもファイルを参照可能な状態となっています。
これは由々しき事態です。このままでは、個人情報漏洩なんてことにもなりかねません。
そこで、この事態を解決したいと思います。
具体的には、下記のようなコードとなります。
add_filter( 'mwform_upload_dir_mw-wp-form-〇〇〇', function ($path,$Data,$key){
$upload_dir = wp_upload_dir();
return "/mwform_upload_dir{$upload_dir['subdir']}";
}, 10, 3 );
add_filter( 'mwform_admin_mail_raw_mw-wp-form-〇〇〇',function($Mail_raw,$values,$Data){
if(is_array($Mail_raw->attachments) && count($Mail_raw->attachments)){
$files = [];
$size = 0;
$dir = '';
$key = '';
foreach($Mail_raw->attachments as $k => $v){
if(!empty($v)){
$files[$k] = $v;
$size += filesize($v);
if(empty($dir)){
$dir = dirname($v);
}
if(empty($key)){
$key = $k;
}
}
}
if(count($files)){
if($zipfile = getZipCompression($dir,$files)){
$Mail_raw->attachments = array($key => $zipfile);
}
}
}
return $Mail_raw;
}, 10, 3 );
function getZipCompression($target_path, $files, $zip_name = ''){
// 存在チェック
if (! file_exists($target_path) || empty($files) || !is_array($files) || (is_array($files) && !count($files))) {
return false;
}
// ZIPファイル名が未定義の場合は圧縮対象ディレクトリの同階層/日付.zip
if (empty($zip_name)) {
$zip_name = $target_path . '/' . wp_unique_filename( $target_path, date_i18n('YmdHis').'.zip');
}
$zip = new ZipArchive();
try {
// アーカイブをオープン
$zip->open($zip_name, ZIPARCHIVE::CREATE);
// 圧縮対象ディレクトリ
$targetFiles = $files;
if (! empty($targetFiles)) {
foreach ($targetFiles as $targetFilesKey => $targetFilesVal) {
// ファイルのみを抽出
if (is_file($targetFilesVal)) {
// アーカイブに追加
$zip->addFile($targetFilesVal, basename($targetFilesVal));
}
}
}
// アーカイブをクローズ
$zip->close();
} catch (Exception $e) {
return false;
}
return $zip_name;
}
保存先変更
「mwform_upload_dir_mw-wp-form-〇〇〇」というフィルターフックを使用して、アップロードファイルの保存先を変更します。
保存先ディレクトリに.htaccessで直リンクを制限しておくと良いと思います。
複数あるアップロードファイルを圧縮
「mwform_admin_mail_raw_mw-wp-form-〇〇〇」というフィルターフックを使用して、ファイルを圧縮します。
圧縮方法
「ZipArchive」というクラスを使用して、ファイルを圧縮します。この際、パスワード付きの圧縮をすれば仮にこのファイルをダウンロードできたとしてもパスワードを解かない限りは中身を知る術はないということになります。