長すぎるファイル名の添付ファイルアップロードを抑止する

**概要 [#ce222d93]

ファイルの添付時、長すぎる名前のファイルをアップロードできないようにします。「アップロードがエラーになること」「アップロードした跡にダウンロードできないファイルになってしまうこと」を防ぎます。

- Wikiの文字コードがUTF-8であるときのファイル名長を計算する。
- 物理ファイル名の最大長は、255. 変えたい場合は var maxLength = 255; を調整する。

**変更点 [#ec3f3832]

attach.inc.php を変更する

*** 変更前 [#ef2dd5f5]

 // アップロードフォームを表示 (action時)
 function attach_showform()
 {
 	global $vars, $_attach_messages;
 
 	$page = isset($vars['page']) ? $vars['page'] : '';
 	$vars['refer'] = $page;
 	$body = attach_form($page);
 
 	return array('msg'=>$_attach_messages['msg_upload'], 'body'=>$body);
 }

*** 変更後 [#s06c20b6]

 // アップロードフォームを表示 (action時)
 function attach_showform()
 {
 	global $vars, $_attach_messages;

 	$page = isset($vars['page']) ? $vars['page'] : '';
 	$vars['refer'] = $page;
 	$body = attach_form($page);

 	ob_start();
 ?>
 <script type="text/javascript"><!--
 function checkUploadFile() {
 	var maxLength = 255;
 	function getHexNameString(s) {
 		var enc = encodeURIComponent(s);
 		var result = '';
 		for (var i = 0; i < enc.length; i++) {
 			if (enc.substr(i, 1) === '%') {
 				result += enc.substr(i + 1, 2);
 				i += 2;
 			} else {
 				var c = enc.charCodeAt(i) + 0x100;
 				var cs = c.toString(16);
 				result += cs.substr(cs.length - 2, 2).toUpperCase();
 			}
 		}
 		return result;
 	}
 	function getAttachFileName(p, f) {
 		return getHexNameString(p) + '_' + getHexNameString(f) + '.log';
 	}
 	var submitElement = null;
 	var pageName = '';
 	var fileLeafName = '';
 	var fileE = document.getElementById('_p_attach_file');
 	if (fileE.value != '') {
 		if (fileE.value.match(/((^)|([\\\/]))([^\\\/]+)$/)) {
 			fileLeafName = RegExp.$4;
 		}
 	}
 	var nodes = document.getElementsByTagName('input');
 	for (var i = 0; i < nodes.length; i++) {
 		var n = nodes[i];
 		if (n.name == 'refer' && n.type == 'hidden') {
 			pageName = n.value;
 		} else if (n.type == 'submit') {
 			submitElement = n;
 			n.disabled = false;
 		}
 	}
 	var aFileName = getAttachFileName(pageName, fileLeafName);
 	var nameLength = aFileName.length;
 	if (nameLength > maxLength) {
 		submitElement.disabled = true;
 	} else {
 		submitElement.disabled = false;
 	}
 	var warnLabelId = '___warnLabel';
 	var warnLabel = document.getElementById(warnLabelId);
 	if (warnLabel) {
 		while (warnLabel.hasChildNodes()) {
 			warnLabel.removeChild(warnLabel.lastChild);
 		}
 	} else {
 		warnLabel =  document.createElement('span');
 		warnLabel.id = warnLabelId;
 	}
 	if (nameLength > maxLength) {
 		 warnLabel.appendChild(document.createElement('br'));
 		var expLabel = 'ファイル名が長すぎます! 添付できません (' 
 			+ nameLength + '文字 > 最大' + maxLength + '文字)';
 		warnLabel.appendChild(document.createTextNode(expLabel));
 		warnLabel.appendChild(document.createElement('br'));
 		warnLabel.appendChild(document.createTextNode('Page: ' + pageName));
 		warnLabel.appendChild(document.createElement('br'));
 		warnLabel.appendChild(document.createTextNode('File: ' + fileLeafName));
 		warnLabel.appendChild(document.createElement('br'));
 		warnLabel.appendChild(document.createTextNode('Internal filename: ' + aFileName));
 		warnLabel.style.color = 'red';
 		warnLabel.style.fontWeight = '';
 	}
 	var fileEnext = fileE.nextSibling;
 	fileE.parentNode.insertBefore(warnLabel, fileEnext);
 }
 function __attach_toolongfilename_onload() {
 	var fileE = document.getElementById('_p_attach_file');
        if (fileE) {
                fileE.onchange = checkUploadFile;
        }
 }
 if (window.addEventListener) window.addEventListener("load", __attach_toolongfilename_onload, false);
 if (window.attachEvent) window.attachEvent("onload", __attach_toolongfilename_onload);
 // -->
 </script>
 <?php
 	$js = ob_get_contents();
 	ob_end_clean();
 	$body = $js . $body;
 	return array('msg'=>$_attach_messages['msg_upload'], 'body'=>$body);
 }

**差分 [#x8d16be0]

1S+				"Filename: $filename<br>\n" .
 +				"Filename length: $filename_length<br/>\n" .
 +				"Filename limit: $filename_max_length<br/>\n";
 +			// Filename too long
 +			return array('msg'=>$_title_edit, 'body'=>$msg);
 +		}
 +	}
  	if ($postdata == '') $postdata = auto_template($page);
  
  	return array('msg'=>$_title_edit, 'body'=>edit_form($page, $postdata));

**コメント [#i219f741]

#comment


トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Site admin: PukiWiki Development Team

PukiWiki 1.5.4+ © 2001-2022 PukiWiki Development Team. Powered by PHP 8.2.12. HTML convert time: 0.012 sec.

SourceForge