#author("2022-03-21T20:46:39+09:00","default:umorigu","umorigu") 長すぎるファイル名の添付ファイルアップロードを抑止する **概要 [#ce222d93] ファイルの添付時、長すぎる名前のファイルをアップロードできないようにします。「アップロードがエラーになること」「アップロードした後にダウンロードできないファイルになってしまうこと」を防ぎます。 - Wikiの文字コードがUTF-8であるときのファイル名長を計算する。 -- WikiがEUC-JPであるときに、「将来UTF-8化する際に問題になるようなファイルをアップロードさせない」目的での利用も可能。 - 物理ファイル名の最大長は255. 変えたい場合は var maxLength = 255; を調整する。 *** 動作確認済みブラウザ [#g8b82654] - IE6, IE8, Chrome 11, Firefox 4, Safari 5, Opera 10 ** 表示例 [#d621c6d7] 「長い名前を持つページ/階層1/階層2」というページの「添付」で「あいうえおかきくけこさしすせそたちつてとなにぬねのは.txt」というファイルを選択すると、 &color(red){ファイル名が長すぎます! 添付できません (261文字 > 最大255文字)};&br; &color(red){Page: 長い名前を持つページ/階層1/階層2};&br; &color(red){File: あいうえおかきくけこさしすせそたちつてとなにぬねのは.txt};&br; &color(red){Internal filename: E995B7E38184E5908DE5898DE38292E68C81};&br; &color(red){E381A4E3839AE383BCE382B82FE99A8EE5B1A4312FE99A8EE5B1A432_E381};&br; &color(red){82E38184E38186E38188E3818AE3818BE3818DE3818FE38191E38193E38195};&br; &color(red){E38197E38199E3819BE3819DE3819FE381A1E381A4E381A6E381A8E381AAE3};&br; &color(red){81ABE381ACE381ADE381AEE381AF2E747874.log};&br; というメッセージが表示され、[アップロード]ボタンがDisableになり押せなくなります。 **変更点 [#ec3f3832] attach.inc.php の attach_showform() を変更する。 - 全体のコードはこちら: https://gist.github.com/1002711 -- attach.inc.php に他のカスタマイズを入れている場合は、差分を手動で適用するのが無難です。 *** 説明 [#ddc7d231] アップロードファイル選択時の onchange で JavaScriptによってファイル名を計算する。 *** 変更前 [#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); } ** 関連 [#n063d19b] - [[PukiWiki/1.4/ちょっと便利に/長すぎるページ名のページの新規作成を抑止]] **コメント [#i219f741] - UTF-8にしたらファイル名長さ制限が厳しくなったので、それをユーザーにそれとなく理解してもらうために作りました -- [[umorigu]] &new{2011-06-05 (日) 14:07:47}; - 変更前→変更後への差分?そのまま置き換えしたら、変更後の行頭が+となっているところでPHPの構文エラーが出そうな気がする。 -- &new{2011-06-04 (土) 16:42:51}; - コピペミスしてました。(-_-; 修正しました -- [[umorigu]] &new{2011-06-05 (日) 13:30:14}; - 本体でもチェックするとしたら、こうなるのかな? -- [[Logue]] &new{2011-06-20 (月) 18:14:50}; function attach_upload($file, $page, $pass = NULL) { global $_attach_messages, $notify, $notify_subject; if (PKWK_READONLY) die_message('PKWK_READONLY prohibits editing'); + $filename_length = strlen(encode($page).'_'.encode($file['name'])); + if ( $filename_length >= 255){ + return array( + 'result'=>FALSE, + 'msg'=>'ファイル名が長すぎます。' + ); + } - [[BugTrack/2563]] 添付ファイル名の長さ制限 -- [[umorigu]] &new{2022-03-21 (月) 20:46:39}; #comment