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

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

ただいまの
回答率

90.51%

  • Excel

    1542questions

    Excelは、マイクロソフト社が開発しているデータ集計や分析を行う表計算ソフトの一つです。文書作成や表計算、資料作成などの多彩な機能を備えており、統合パッケージであるMicrosoft Officeに含まれています。

  • Perl

    457questions

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

  • IIS

    183questions

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

  • アップロード

    63questions

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

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

解決済

回答 3

投稿

  • 評価
  • クリップ 1
  • VIEW 242

takoyaki-g

score 4

皆様、初めまして

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

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

BEGIN { close(STDERR); }

use CGI;
use File::Copy;
use File::Basename;

my $q = new CGI;
my $path = "C:/upload/test";

#file01
if($q->param('file01')) {
    my $fname = basename($q->param('file01'));
    my $newfile = "${path}/${fname}";
    my $fh = $q->upload('file01');
    copy ($fh, "$newfile");
}

undef $q;

print "Location: complete.htm\n\n";
    <body>
        <div>
            <form action="test.cgi" method="post" enctype="multipart/form-data" onSubmit="return check(this)">

                <p id="user" value="" style="font-size:20px">--------</p>
                <!-- FILE01 -->
                <input type="file" id="file01" name="file01" size="80">

                <input type="reset"  name="reset"  value=" 取消 ">
                <input type="submit" name="submit" value=" 送信 ">
            </form>
        </div>
    </body>

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • mts10806

    2018/07/09 13:59

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

    キャンセル

  • takoyaki-g

    2018/07/09 14:15

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

    キャンセル

回答 3

check解決した方法

+1

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 17:21

    この記事でも良さそうですね。
    https://koumei2.com/wiki/1068

    こちらでも「根本的な解決にはなってない」と書かれていますが、
    param() の仕様では?というところも挙がっていますね。

    解決したようで何よりです。

    キャンセル

  • 2018/07/09 17:31

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

    キャンセル

0

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

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/07/09 14:35

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

    キャンセル

  • 2018/07/09 14:36

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

    キャンセル

  • 2018/07/09 14: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である事自体は問題ではないのではないかと。

    キャンセル

  • 2018/07/09 14:50

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

    キャンセル

0

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.51%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Excel

    1542questions

    Excelは、マイクロソフト社が開発しているデータ集計や分析を行う表計算ソフトの一つです。文書作成や表計算、資料作成などの多彩な機能を備えており、統合パッケージであるMicrosoft Officeに含まれています。

  • Perl

    457questions

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

  • IIS

    183questions

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

  • アップロード

    63questions

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