Manual:ファイルのアップロードの設定
MediaWikiはメディアファイルのアップロードと統合をサポートします。 このページではこの機能の技術的な面を説明します。一般的な使い方の情報については Manual:画像の管理 および Help:画像 を参照してください。
アップロード機能は MediaWiki バージョン 1.1 から実装されていますが、セキュリティを考慮し既定では無効になっています。 アップロードは構成設定で有効にできますが、いくつかの前提条件を確認しておくことをお勧めします。
前提条件
アップロードがPHPで有効になっていることを確認する
以下の項目は php.ini で設定する必要があります:
file_uploads = On
設定されていない場合、PHPスクリプトはアップロード機能を使用できないのでMediaWikiのアップロード機能も有効になりません。
「open_basedir」が設定されている場合、MediaWiki インストレーションのディレクトリ({$IP}/images)と「upload_tmp_dir」フォルダ(設定していない場合は既定のシステムフォルダ)の両方を対象に指定する必要があります。 If this is in effect, also check if your hoster has properly configured 'sys_temp_dir', because sometimes they forget about that as well and you cannot write temporary files at all (upload, session or any other tmp file).
「upload_tmp_dir」を追加すると「Could not find file "/var/tmp/php31aWnF"」(「upload_tmp_dir」が「/var/tmp」である場合)のようなメッセージを避けることができます。 より詳しくはPHPのファイルアップロードについての文書ファイルアップロードの基本そして特にmove_uploaded_file()を参照してください。
Windows と IIS 利用者対策
%SystemRoot%\TEMP
の設定により Internet Guest Account (IUSR
_MachineName または IIS 7 以降はIUSR
): を読み取り・書き込み・実行可能に設定。
ディレクトリのセキュリティを調査する
アップロードディレクトリの設定では、エンドユーザーによるwikiもしくはウェブサイトに損害を与える可能性のある外部スクリプトを実行不能にして (参照)、アップロードとウェブディレクトリへの不正なアクセスを予防する必要があります。
/images
フォルダ (または以前のバージョンでは/uploads
フォルダ ) に「755」許可を設定。
- ユーザーは読み取り、書き込み、実行ができるようにします。
- グループは読み取り、実行ができるようにします。
- ワールドは読み取り、実行ができるようにします。
SELinux を使用する場合は、それに応じて ACL を調整するようにしてください(そちらを参照してください)。
Check webserver security
See Manual:Security#Upload security for changes to make to your webserver configuration to prevent uploaded files from executing code or having browsers execute malicious files.
- イメージフォルダのディレクトリリストを制限する
パブリックユーザにイメージフォルダのリストを表示させたくない場合は、これをApache設定で設定することもできます:
<Directory /var/www/wiki/images>
Options -Indexes
</Directory>
.htaccess ファイルの確認
MediaWikiのインストールフォルダにあるimages
ディレクトリには、いくつかの設定がある.htaccessファイルが含まれています。
このファイルの目的は、アップロードフォルダをより安全にすることです。アップロードディレクトリを別の場所に置く場合は、.htaccessファイルを新しい場所にコピーするか、サーバー上でその設定を直接適用することをお勧めします。
ただし、これらの構成の中には、サーバーの構成によっては競合やエラーの原因となるものがあります。
いくつか注意点があります。
- サーバーが.htaccessファイルのディレクティブを設定または上書きできない場合、そのフォルダーの下のファイルにアクセスすると、一般的な「HTTP 500エラー」が発生する可能性があります。 その場合は、行をコメントアウトし、それらのディレクティブをサーバー構成ファイルに直接適用する必要があります。 問題の原因となる可能性の高いディレクティブは、HTMLとPHPファイルがHTMLとして扱われるのを防ぐ
AddType
とPHPファイルがサーバー上で解析されて実行されないようにするphp_admin_flag
です。
アップロードをon/offに設定する
MediaWiki バージョン: | ≧ 1.5 |
MediaWiki バージョン 1.5以降は、設定する属性は LocalSettings.php に存在し、その $wgEnableUploads
の内容は以下の通りです:
$wgEnableUploads = true; # アップロードを有効にする
アップロード機能を無効にするためにはこの属性をfalseに設定します:
$wgEnableUploads = false; # アップロードを無効にする
集中リポジトリを使う
InstantCommonsは設定変更が可能な機能で、ウィキメディアコモンズの何百万という無料の(自由にライセンスされた)ファイルにすぐにアクセスできます。
アップロードの権限
既定では、登録されているすべての利用者がファイルをアップロードできます。 これを制限するには $wgGroupPermissions を変更してください:
- 一般利用者にはファイル アップロードを許可しない:
$wgGroupPermissions['user']['upload'] = false;
- 「uploadaccess」という名前の特殊グループを作成し、所属するメンバーにファイル アップロードを許可する:
$wgGroupPermissions['uploadaccess']['upload'] = true;
- 自動承認された利用者 (新規ではない利用者) にファイル アップロードを許可する:
$wgGroupPermissions['autoconfirmed']['upload'] = true;
既存ファイルを置き換える権限は、reupload
と呼ばれる追加の許可で制御されています。
- 一般利用者に既存ファイルの上書きを許可しない:
$wgGroupPermissions['user']['reupload'] = false;
- 自動承認された利用者 (新規ではない利用者) にファイル更新を許可する:
$wgGroupPermissions['autoconfirmed']['reupload'] = true;
ForeignFileRepoが設定されている場合、ローカルにあるファイルを置き換える権限は reupload-shared
と呼ばれる特別な権限で制御されています。
- ローカルにあるファイル リポジトリのファイルの上書きを一般利用者に許可しない:
$wgGroupPermissions['user']['reupload-shared'] = false;
- 自動承認された利用者 (新規ではない利用者) に対しローカルのファイル リポジトリにあるファイルの置換を許可する:
$wgGroupPermissions['autoconfirmed']['reupload-shared'] = true;
利用者権限について詳しくは Manual:利用者権限 を、アクセス制限について詳しくは Manual:アクセス制限 を参照してください。
ファイルタイプの設定
LocalSettings.php に $wgFileExtensions を追加することにより、その他のご希望の種類のファイルをアップロードできるようになります。 例えば、$wgFileExtensions の行を以下のように変更することができます。
$wgFileExtensions = [ 'png', 'gif', 'jpg', 'jpeg', 'doc',
'xls', 'mpp', 'pdf', 'ppt', 'tiff', 'bmp', 'docx', 'xlsx',
'pptx', 'ps', 'odt', 'ods', 'odp', 'odg'
];
もしくは
$wgFileExtensions = array_merge( $wgFileExtensions, [
'doc', 'xls', 'mpp', 'pdf', 'ppt', 'xlsx', 'jpg',
'tiff', 'odt', 'odg', 'ods', 'odp'
] );
もしくは
# DefaultSettings.php で定義されている既存のアップロード許可ファイル種別リストに、新たなファイル種を追加してください。
$wgFileExtensions[] = 'docx';
$wgFileExtensions[] = 'xls';
$wgFileExtensions[] = 'pdf';
$wgFileExtensions[] = 'mpp';
$wgFileExtensions[] = 'odt';
$wgFileExtensions[] = 'ods';
However, certain file extensions are prohibited ($wgProhibitedFileExtensions , formerly $wgFileBlacklist for MediaWiki 1.36 and earlier) and cannot be uploaded even if added to $wgFileExtensions. 禁止されている拡張子のファイルをアップロードするには、$wgProhibitedFileExtensions を変更する必要があります。 たとえば、利用者が実行可能ファイルをアップロードできるようにするには:
$wgFileExtensions[] = 'exe';
$wgProhibitedFileExtensions = array_diff( $wgProhibitedFileExtensions, [ 'exe' ] );
さらに、$wgMimeTypeExclusions (以前の名前は $wgMimeTypeBlacklist ) は MIME タイプに基づいて特定のファイル タイプを制限します; 例えば .zip ファイルは MIME タイプに基づいて禁じられます (MediaWiki バージョン 1.14 から 1.17 まで)。
$wgStrictFileExtensions を設定することもできます
$wgStrictFileExtensions = false;
ほとんどの種類のファイルをアップロードできるようにします。ただし、禁止されたファイル タイプと MIME タイプは引き続き許可されません。
「ファイルが壊れているか、拡張子が間違っています」というエラーが表示された場合は、MIME タイプ検出が正しく動作していることを確認してください。
どんな種類のファイルでも許可することにした場合、MIME検出が機能していることを確認し、アップロードのためのウイルススキャンを有効にする について考えてみてください。
拡張子zipを有効にするには、LocalSettings.php ファイルに次の記述が必要です (MediaWiki v1.19.23 でテスト済み)。
$wgFileExtensions[] = 'zip';
// $wgTrustedMediaFormats[] = 'ARCHIVE';
$wgTrustedMediaFormats[] = 'application/zip';
ログイン
標準では、anonymousによるアップロードは許可されていません。 ツールボックスに「ファイルのアップロード」リンクが表示される前に、登録とログインが必要です。
サムネイル
自動的な画像処理/サムネイル化の情報は、Image thumbnailing (画像サムネイル) を参照してください。 サムネイルに関する問題については、画像のサムネイルが機能しない、または表示されないを参照してください。
MediaWiki バージョン: | ≧ 1.11 |
ファイルが画像やビデオのように視覚的でない場合、代わりにファイルアイコンが使用されます。
FileRepoグループのFileクラスのiconThumb()
関数で生成されます。
"$wgStyleDirectory/common/images/icons/
"に格納されているアイコンを "fileicon-$extension.png
"フォーマットで表示します。
ファイルのアップロードのための最大サイズを設定する
ブラウザは、実際にファイルを送信する前に、アップロードするファイルのサイズをサーバーに知らせます。
アップロードのサイズが大きすぎる場合、ターゲット(サーバー)に拒否され、どの層で制限がかかったかによって複数のエラーを出してアップロードが失敗します。
- サーバー(nginx, Apache)が送信データの最大量を制限している場合、単純にHTTP 500エラーまたはHTTP 413 - Request entity too largeで失敗する可能性があります。
- PHPレベルでの制限の場合、post_max_sizeがヒットした場合、一般的なHTTP 500エラー(もしくは単に空白ページ)を得るかもしれません、そうでなければ、MediaWikiはより意味のあるエラーメッセージを与えるはずです。
既定では、php.ini の設定は、アップロードされるファイルのサイズを2メガバイト(およびポスト操作の最大サイズは8メガバイト)に制限します。 さらに大きなファイルをアップロードできるようにしたい場合、php.ini 内でこれらのパラメーターを編集してください:
- post_max_size、既定では8メガバイトの大きさです。
- upload_max_filesize、既定では2メガバイトの大きさです。
これはサーバにアクセスするroot権限が必要です - 共有サーバ上にある場合、サーバの管理者に連絡をして下さい。
- php.iniファイルの場所を確認する
php.ini ファイルの保存先はご利用の配布により異なります。 See Manual:php.ini for instructions for locating the correct php.ini used by your web server (as opposed to the php.ini used by the command line binary).
- 1つのサーバーで複数のウェブサイトをホストする
If you have more than one website hosted on a server and want to change only for MediaWiki, insert into your /etc/apache2/sites-enabled/your_wiki_site.com inside <Virtual Host>:
php_value upload_max_filesize 100M
php_value post_max_size 100M
上記の設定は、mod_phpを使用しているサイトであれば、.htaccess ファイルでも有効です。 もしPHP 5.3 以降をご利用で利用可能に設定するには、php.ini ディレクティブを .user.ini ファイル内に配置します。
- Webサーバの制限
ご利用のWebサーバによっては、アップロードできるファイルのサイズにさらに制限条件が付加されます。 Apache では LimitRequestBody もそのような設定の一つです。 [1] Nginx 向けはclient_max_body_size が該当の設定です[2] Lighttpd では場合により server.max-request-size の調整が必要[3]。
Ubuntu 16.04: sudo service apache2 restart
(たとえば Linux の sudo /etc/init.d/php5-fpm リスタート。)
- 画像ファイルが重すぎるときの警告
MediaWiki は $wgUploadSizeWarning オプションよりも大きなファイルをアップロードしようとすると警告を発します。 これはPHPによる制限とは独立しています。
- 一時的なアップロード制限
アップロード制限を一時的に変更するには (特定のファームウェアで複数のウィキを走らせる場合など)、次の行を追加します。
ini_set( 'post_max_size', '50M' );
ini_set( 'upload_max_filesize', '50M' );
追加はウィキ単位で、場所は MediaWiki LocalSettings.php
設定ファイルです。
このサンプルの PHP 上限は 50 Mb 。
これらの設定は、上で設定した最大値を上書きしないことに注意しましょう (コア php.ini および apache2 php.ini ファイルは絶対的な最大値を設定するからです)。
このメソッドは、絶対最大値よりも小さい最大値を設定する。
- IIS7 アップロード上限
<system.webServer>
に以下のコードを追加することで、最大ファイルサイズを大きくすることで解決できます。<security> <requestFiltering> <requestLimits maxAllowedContentLength="50000000" /> </requestFiltering> </security>
上記のmaxAllowedContentLengthでは、ユーザーは50,000,000バイト(50MB)の大きさのファイルをアップロードすることができます。 この設定は、IISのサービスを再起動することなく、すぐに動作します。 web.config ファイルは、Web サイトのルートディレクトリにあります。
アップロードできるファイルの上限を2ギガにする:
以下を LocalSettings.php
に追加:
$wgUploadSizeWarning = 2147483647;
$wgMaxUploadSize = 2147483647;
php.ini で以下の行を調整。
memory_limit = 2048M (this line may not be necessary)
post_max_size = 2048M
upload_max_filesize = 2048M
IIS web.config file で maxRequestLength 設定値を上書きします。 例えば、web.configの以下の項目は、2GB以下のファイルをアップロードすることを許可しています。
<httpRuntime maxRequestLength="2097151" executionTimeout="18000"/>
IIS 7では、大容量のアップロードを許可する設定も必要です。 これは、ウィンドウ中央のIISセクションにある「要求フィルタリング > 機能設定の編集」をクリックすることで確認できます。 Set the ”Maximum allowed content length (Bytes)” field to 2147482624. If you don’t see "Request Filtering" in the IIS section, it needs enabled via Internet Information Services > World Wide Web Services > Security in the "Turn Windows features on or off" area in Control Panel.
上記の方法で大容量アップロードができない場合は、コマンドプロンプトを開いて、以下のコマンドも実行してください。
%windir%\system32\inetsrv\appcmd set config -section:requestFiltering -requestLimits.maxAllowedContentLength: 2147482624
Java JAR のアップロードの許可
MediaWiki は既定ですべての ZIP 形式に見えるファイルをスキャンし、Java .class を検出するとファイルを拒否します。 セキュリティ上、悪意のある Java applet のアップロードの予防策として実施されています。 非公開サイト限定で、以下を使いこの検知を無効にします。
$wgAllowJavaUploads = true;
この設定は、MIME タイプを無差別に受け入れることの回避策として使用できます。 例えば、Word 2007 で作成した .doc ファイルをアップロードしようとすると、提供されたテキスト リストや MIME タイプの確認/制御に関係なく、以下のメッセージが表示される可能性があります:
- このファイルは破損しているか、さもなければ読めないZIPファイルです。セキュリティチェックを適切に行うことができません。
Word 2007 で保存した拡張子.doc のファイル (おそらくそれ以降のバージョンでも) には小さな ZIP 形式の圧縮が含まれ、2007以前のワードと異なりバイナリの .doc 形式で表現可能できない metadata が書き込まれています。 この埋め込み ZIP データが引っかかり、Java archive 検査器は .doc ファイルを拒否します。 それより新しい .docx 形式のファイルは ZIP 圧縮に問題がまったくないため、アップロードは正常に行われ $wgAllowJavaUploads の設定は不要です。
URLより直接アップロード("Sideloading")
コンピューター内のファイルの代わりに URL を指定する直接アップロードを利用者に対し許可する場合、$wgAllowCopyUploads = true
を設定してください。
既定では URL からの直接アップロードは API (または UploadWizard などの拡張機能) の使用が条件です。
「特別:アップロード」でこのオプションを有効にするには、$wgCopyUploadsFromSpecialUpload に true
を設定することも忘れないでください。
するとアップロード用フォームのファイル名記入欄の下に、URL記入欄が追加されます。
このURL欄は既定では記入できなうようにグレー表示ですが、欄の横のボタン (チェックボックス) で有効と無効を切り替えます。
ただしこの機能の利用は、利用者権限 upload_by_url
のある場合に限定されます。
システム管理者は、MediaWiki 1.20 以前とは異なり、既定ではなく個別に権限を申請することになりました。
通常のユーザ向けに許可する方法。
$wgGroupPermissions['user']['upload_by_url'] = true;
ウェブ上の任意の場所から直接アップロードできるようにすると、ランダムで不要なものをアップロードしやすくなり、人々がウェブ上で遭遇する可能性のあるものなら何でもアップロードしてよいというように誤解される可能性があることを心に留めておいてください。
$wgHTTPProxy
needs to be set accordingly. 直接提供するか、あるいは、サーバーが phpinfo()
で環境変数 http_proxy
を提供している場合は、LocalSettings.php
で以下のコードを使用することができます:/*
* Proxy to use for CURL requests.
*/
if ( isset( $_ENV['http_proxy'] )) $wgHTTPProxy = $_ENV['http_proxy'];
まとめてアップロード
複数のファイルをアップロードするには、個別ではなくまとめて処理するツールがいくつかあります。
拡張機能 | 説明 | リリースの状態 | 要件 |
---|---|---|---|
Extension:UploadWizard | ウィキメディア・コモンズで使用されています | 安定版 | MediaWiki 1.23+ |
Extension:MsUpload | Allows a user to upload multiple files including by dragging & dropping files. | 安定版 | 1.32+ |
Extension:SimpleBatchUpload | Basic, no-frills uploading of multiple files to MediaWiki | 安定版 | 1.31+ |
Extension:VisualData/File_upload | Includes a fully-configurable multiple file upload with filename formula and CRUD operations | Stable | 1.35+ |
Commonist (external link to Wikimedia Commons) | api.php 経由でのファイル アップロードに必要です。
| ||
importImages.php | "Place the files on the server in a readable location and execute the maintenance/importImages.php script from the command line."[5]
|
アップロード ディレクトリ
画像を1件アップロードすると、いくつか生成されるものがあります。
- ファイル名前空間の記事。記事のタイトルにはファイル名、たとえば File:MyPicture.png を使用。 このページが保存されると、通常のページ同様に編集できます。
- ファイル自体はファイルシステムの
$wgUploadDirectory
で設定されたフォルダもしくはそのサブフォルダに保存されます (以下を参照してください。) - サムネイル化が用意できる場合は、ファイルのサムネイル版画像を作成して提供します (ファイル説明ページで使用する場合など。 それぞれのサムネイルはメインの画像ファイル名にしたがって、個別のフォルダに入れてサムネイルディレクトリに保存します。
If $wgHashedUploadDirectory is enabled (by default), MediaWiki creates several subdirectories in the images directory.
If $wgHashedUploadDirectory
is set to true
, uploaded files will be distributed into sub-directories of $wgUploadDirectory based on the first two characters of the md5 hash of the filename. (e.g. $IP/images/a/ab/foo.jpg)
このようなサブディレクトリの作成は、自動的に行われます。
ファイルシステムによっては、1つのフォルダに大量のファイルがあるとうまく動作しないことがあるため、これを利用して1つのフォルダに大量のファイルが存在しないようにします。
もし、アップロードされる画像が少なく、小さなWikiしか管理していないのであれば、$wgHashedUploadDirectory = false
を設定することでこれをオフにし、すべての画像は$wgUploadDirectory自体にアップロードされるようにすることができます。(例: $IP/images/foo.jpg)
Multiwiki サイト
LocalSettings.php
のサイトの場所を、例えば/var/lib/mediawiki
からあなたのインストールした場所に変更し、書き込み可能な画像ディレクトリを作成したことを確認してください(残りのほとんどはシンボリックリンクで可能です)。
そうしないと、画像のアップロードが不思議とうまくいきません。
アップロード用フォームの設定
インストールに含まれる既定のアップロード用フォームはメッセージを (「ファイルをアップロード」リンクやSpecial:Uploadリンクを押した時に) 表示しますが、必ずしもご利用のウィキに適しているとは限りません。
その場合にはMediaWiki:Uploadtextの内容を編集し、メッセージを書き換えます。 ご利用のウィキが多言語版の場合は、MediaWiki:Uploadtext/deなどを編集して地域化するのをお忘れなく。
MediaWiki:Licenses ページにあるドロップダウンメニューで、 ご利用のウィキのアップロードのライセンスを個別化します。 See the documentation of this feature.
ただしMediaWiki:Licenses/deなど地域化したバージョンは既定では表示されません。
有効にするには、$wgForceUIMsgAsContentMsg
変数を設定します。
アップロードフォームの「要約欄」に表示する既定のメッセージは、MediaWiki:Upload-default-descriptionを編集して追加します(例えばご利用のウィキサイトでアップロード要約欄に既定のテンプレートを設定して全員に使用させたい場合など。)
Windowsにおける既知の問題
Windows サーバ上で MediaWiki を走らせると 、PHP バグが原因でファイル名にいくつか制限があります。 PHP は非ASCII文字を使ったファイル名を正しく処理できないため(訳注:後出)、MediaWiki ではアップロード失敗の予防策としてファイル名にそれら文字を使ったファイルに対し、このウィキではファイル名に特殊文字を使用できません。 を表示して受付を拒否する (タスク T3780) ことがあります。
MediaWiki 1.31 以降で PHP 7.1 以降を使う場合、MediaWiki で非ASCII文字が処理できるようになりました。
英字・数字以外の文字を使用したデータベースにおける既知の問題
もし $wgDBname
に 英字・数字以外の文字が含まれている場合、以下のようなエラーが発生する場合があります: Could not create directory "mwstore://local-backend/local-public/<path>"..
ファイル バックエンドの有効なコンテナ名を内部チェックが原因ですが、構成に $wgDBname
を使用しています。
MediaWiki 1.26 より、$wgDBname
にドットが含まれている場合でのアップロードが可能となりました。
関連項目
- セキュリティ部 アップロードのセキュリティ
- Manual:Configuration settings#Uploads はファイルのアップロードに関する設定変数のリスト
- Category:Upload variables - 同上のリストをカテゴリ別に表示 (ABC 順)
- ファイルのアップロードをしたのに白紙のページが表示された場合
- 新しいファイルタイプのサポート追加
脚注
- ↑ core - Apache HTTP Server Version 2.4 - LimitRequestBody Directive、Apache manual
- ↑ Nginx マニュアルはclient_max_body_size こちら。
- ↑ Lighthttpd のマニュアルはserver.max-request-size こちら。
- ↑ IIS7 is a new revision (version 7.0) of the Internet Information Services that is part of Windows Vista and the next Windows Server version.
- ↑ http://xpt.sourceforge.net/techdocs/language/wiki/wikimedia/wkm07-MediaWikiImport/index.html#mass_image_upload_zip_