#!/usr/local/bin/perl -w # # Example script for HTTP upload # # Copyright (C) 2008 YAMAHA CORPORATION. All rights reserved. # # $Revision: 1.8 $ # $Date: 2021/04/15 04:19:39 $ # # モジュール読み込み use strict; use CGI; use CGI::Carp qw(carpout); use File::Path; # POSTサイズの上限 $CGI::POST_MAX = 3 * 1024 * 1024; # 3MB my $query = new CGI; ### 初期設定 ### # 最大許容サイズ(KByte) my $maxsize = 2560; # ディレクトリ名の最大長 my $maxdirlen = 32; # ファイル名の最大長 my $maxfilelen = 32; my $localtime = localtime(); # ディレクトリ名 use constant { MAX_DIR_TREE => 5, DELIMIT => '/', DIR_TREE => ['savedir1', 'savedir2', 'savedir3', 'savedir4', 'savedir5'], }; ### 送られてきたデータを処理する ### # MACアドレスの取得 my $file = $query->upload('macadr') ? $query->upload('macadr') : ""; if (!$file) { # POST_MAXのエラーチェック if ($query->cgi_error) { my $err = $query->cgi_error; &error("$err") if ($err); } } # # 添付ファイル名のエラーチェック(LAN1のMACアドレス) # $file =~ s/\r//; $file =~ s/\n//; # MACアドレスを保存 my $mac = $file; if (substr($file, 0, 6) ne "00a0de" && substr($file, 0, 6) ne "ac44f2") { &error("500 Macaddress error($file)"); exit; } # 保存先ディレクトリ名の取得 my $savedir = ''; for (my $xx = 0 ; $xx < MAX_DIR_TREE ; $xx++) { my $dir_save = $query->param(DIR_TREE->[$xx]) ? $query->param(DIR_TREE->[$xx]) : ''; if ($dir_save ne '') { # # 保存先ディレクトリ名のチェック # $dir_save =~ s/\r//; $dir_save =~ s/\n//; if ((my $dir_len = length($dir_save)) > $maxdirlen) { &error("500 Directory length error($dir_save, $dir_len)."); exit; } if ($dir_save =~ /^[\.-]|[\\:\*\?\"<>\|]/){ &error("500 Directory name error($dir_save)."); exit; } if ($savedir ne '') { $savedir .= DELIMIT; } $savedir .= $dir_save; } } # # 保存先ディレクトリ名のエラーチェック # # 保存ファイル名の取得 my $savefile = $query->param('savefile'); # # 保存ファイル名のエラーチェック # $savefile =~ s/\r//; $savefile =~ s/\n//; if ((my $file_len = length($savefile)) > $maxfilelen) { &error("500 File length error($savefile, $file_len)."); exit; } if ($savefile =~ /^[\.-]|[\\:\*\?\"<>\|]/){ &error("500 File name error($savefile)."); exit; } if ($savedir ne '') { if (! -d $savedir) { mkpath[$savedir] || die "Can't mkpath:$savedir."; } } else { $savedir = '.'; } &error("500 File transfer error.") unless (defined($file)); # ファイルサイズの取得 my $size = (stat($file))[7]; # サイズ制限 &error("500 Filesize is too large. Max $maxsize KB") if ($size > $maxsize * 1024); ### ファイル保存 ### my ($buffer); open (OUT, ">$savedir/$savefile") || die "Can't open $savefile!"; binmode (OUT); print "Content-type: text/plain\n\n"; while (read($file, $buffer, 1024)) { if ($CGI::OS eq 'UNIX') { $buffer =~ s/\r\n/\n/g; # 改行コードの変換 } print OUT $buffer; } close (OUT); close ($file) if ($CGI::OS ne 'UNIX'); # Windows用 chmod (0666, "$savefile"); exit; ### エラー出力 ### # エラーメッセージを返す # sub error_html { my ($err_mes) = @_; print "Content-type: text/html\r\n"; print "Status: $err_mes\r\n"; print "\r\n"; exit; } sub error { my ($err_mes) = $_[0]; if ($mac) { open (OUT, ">>error_$mac.txt") || die "Can't open error_$mac.txt!"; } else { open (OUT, ">>error.txt") || die "Can't open error.txt!"; } print OUT "[$localtime] "; print OUT $err_mes; print OUT " from $ENV{'REMOTE_ADDR'}($ENV{'HTTP_USER_AGENT'})\n"; close(OUT); error_html($err_mes); exit; } __END__