- 追加された行はこの色です。
- 削除された行はこの色です。
#author("2022-03-21T20:46:39+09:00","default:umorigu","umorigu")
長すぎるファイル名の添付ファイルアップロードを抑止する
**概要 [#ce222d93]
ファイルの添付時、長すぎる名前のファイルをアップロードできないようにします。「アップロードがエラーになること」「アップロードした跡にダウンロードできないファイルになってしまうこと」を防ぎます。
ファイルの添付時、長すぎる名前のファイルをアップロードできないようにします。「アップロードがエラーになること」「アップロードした後にダウンロードできないファイルになってしまうこと」を防ぎます。
- Wikiの文字コードがUTF-8であるときのファイル名長を計算する。
- 物理ファイル名の最大長は、255. 変えたい場合は var maxLength = 255; を調整する。
-- 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.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);
}
**差分 [#x8d16be0]
** 関連 [#n063d19b]
- [[PukiWiki/1.4/ちょっと便利に/長すぎるページ名のページの新規作成を抑止]]
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);
+ }
**コメント [#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'=>'ファイル名が長すぎます。'
+ );
+ }
if ($postdata == '') $postdata = auto_template($page);
return array('msg'=>$_title_edit, 'body'=>edit_form($page, $postdata));
- [[BugTrack/2563]] 添付ファイル名の長さ制限 -- [[umorigu]] &new{2022-03-21 (月) 20:46:39};
**コメント [#i219f741]
#comment