質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Perl

Perlは多目的に使用される実用性が高い動的プログラミング言語のひとつです。

IIS

IIS(Internet Information Services)はマイクロソフト社によって開発されたwebサーバーです。Windows上で動作します。

アップロード

アップロードは特定のファイルをウェブサーバに送るプロセスのことを指します。

Q&A

解決済

3回答

3322閲覧

IISでのファイルアップロードによるファイルの破損について

takoyaki-ccc

総合スコア17

Perl

Perlは多目的に使用される実用性が高い動的プログラミング言語のひとつです。

IIS

IIS(Internet Information Services)はマイクロソフト社によって開発されたwebサーバーです。Windows上で動作します。

アップロード

アップロードは特定のファイルをウェブサーバに送るプロセスのことを指します。

0グッド

1クリップ

投稿2018/07/09 04:55

皆様、初めまして

私は現在IISにてCGI(perl)によるアップロードサイトを構築しております。
そこで問題が発生しました。
ファイルをアップロードすると、CGIで指定したフォルダにファイルは格納されるのですが、
ファイルが必ず破損してしまいます。
アップロードするファイルは.xlsmです。

以下、ソースになります。
※フォームを送信する際のcheck()は現状特になにもしておりません

perl

1BEGIN { close(STDERR); } 2 3use CGI; 4use File::Copy; 5use File::Basename; 6 7my $q = new CGI; 8my $path = "C:/upload/test"; 9 10#file01 11if($q->param('file01')) { 12 my $fname = basename($q->param('file01')); 13 my $newfile = "${path}/${fname}"; 14 my $fh = $q->upload('file01'); 15 copy ($fh, "$newfile"); 16} 17 18undef $q; 19 20print "Location: complete.htm\n\n";

html

1 <body> 2 <div> 3 <form action="test.cgi" method="post" enctype="multipart/form-data" onSubmit="return check(this)"> 4 5 <p id="user" value="" style="font-size:20px">--------</p> 6 <!-- FILE01 --> 7 <input type="file" id="file01" name="file01" size="80"> 8 9 <input type="reset" name="reset" value=" 取消 "> 10 <input type="submit" name="submit" value=" 送信 "> 11 </form> 12 </div> 13 </body>

以上となります。
どなたか解決方法などご存知の方がいらっしゃいましたら、
その方法をご教授いただければ幸いです。
宜しくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2018/07/09 04:59

どのようなファイルをアップロードすると起きるとかありますか?
takoyaki-ccc

2018/07/09 05:15

アップロードするファイルはマクロを含んだExcelファイルのほか、テキストファイルなどをアップロードした場合は中身が空となって保存されてしまっています。
guest

回答3

0

自己解決

KojiDoi様
mts10806様

ご回答いただき有難うございます。
お二人の回答を試してみたところ、直接の解決には至らなかったのですが、
アップロードをしたテキストファイルの中身を確認したことろ、先頭に
「CGI::param called in list context from xxx line xxx, this can lead to vulnerabilities.
See the warning in "Fetching the value or values of a single named parameter"」
と追記されておりました。
こちらを調べてみたところ
CGI::param() for perl を リスト内で使うと、脆弱性につながるらしい
というものであり、記載の通り追記してみたところ解決することができました。

このエラーについては全く理解ができていないのですが、一先ずは解決できたので安心しました。
エラーについてはもう少し自分で調べてみたいと思います。
この度はご迷惑をお掛けし申し訳ありませんでした。
本当に有難うございました。

投稿2018/07/09 08:18

takoyaki-ccc

総合スコア17

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2018/07/09 08:21

この記事でも良さそうですね。 https://koumei2.com/wiki/1068 こちらでも「根本的な解決にはなってない」と書かれていますが、 param() の仕様では?というところも挙がっていますね。 解決したようで何よりです。
takoyaki-ccc

2018/07/09 08:31

本当に助かりました。 なぜこの記載の追加が必要なのかわからないため不用意には使えませんが、社内ではこちらを利用しようかと思います!
guest

0

バッファリングの問題ではないでしょうか。 copyした後close $fhしてみて下さい。

投稿2018/07/09 05:48

KojiDoi

総合スコア13669

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

Perl環境がなく、開発に関わっていたのも随分前なので、もしかしたら合わないかもしれませんが、

copy ()関数では 第1引数はテンポラリファイル なので(PHPでもmove_uploaded_file()第1引数はテンポラリを指定します)
下記ではないでしょうか?

perl

1 my $fh = $q->upload('file01'); 2 my $tmpPath = $q->tmpFileName($fh); 3 copy ($tmpPath, $newfile);

投稿2018/07/09 05:21

編集2018/07/09 05:36
m.ts10806

総合スコア80765

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KojiDoi

2018/07/09 05:35

リンクが間違っているようです。
m.ts10806

2018/07/09 05:36

ご指摘ありがとうございます。 リンクURL 修正しました。
KojiDoi

2018/07/09 05:44

perldoc File::Copyに拠れば The "copy" function takes two parameters: a file to copy from and a file to copy to. Either argument may be a string, a FileHandle reference or a FileHandle glob. Obviously, if the first argument is a filehandle of some sort, it will be read from, and if it is a file name it will be opened for reading. なので第一引数が$fhである事自体は問題ではないのではないかと。
m.ts10806

2018/07/09 05:50

なるほど。 空ファイルということなのでハンドルでは正常にファイルができないのかなと。 参照先がテンポラリファイルを第1引数に渡して作っていたので、PHPなどはテンポラリファイルが通例なので同じかと思っていました。 ひとまず質問者さんには試していただきたいですが。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問