0

Perl と html、Linux 上の CGI。フォーム フィールドでサーバー上の CGI に渡されるファイル パス名に関する問題。問題は、PC 側ではなく、Linux ファイル パスにあります。

私は 2 つのプログラムを使用しています。1) 何年も前に書かれたプログラム、perl プログラムで生成された動的 html で、フォームとしてユーザーに提示されます。必要なコードを挿入して、ユーザーが PC からファイルを選択して Linux マシンに配置できるように変更しました。

このプログラムは、Linux 側で必要なファイル パスを既に知っているため、このファイル パスを非表示のフォーム フィールドでプログラム 2 に渡します。

2) Linux 側の CGI プログラム。(1) のフォームが投稿されたときに実行されます。

奇妙な問題。私が渡すファイルパスには、非常に奇妙な問題があります。を使用して抽出できます

my $filepath = $query->param("serverfpath");

上記は、正確に正しいパスのように見えるものを $filepath に取り込みます。
しかし、それは失敗し、ファイルを開くエラーブロックに移動する方法ではなく、CGI スクリプトの呼び出しでエラーが発生します。

ただし、$filepath にまったく同じ文字列をハードコーディングして入力すると、機能し、ファイルが正常にアップロードされます。

例えば:

$fpath1 = $query->param("serverfpath");
$fpath2 = "/opt/webhost/ims/DOCURVC/data" 

$fpath1 と $fpath2 を比較すると、それらが完全に等しいことがわかります。$fpath1 と $fpath2 の長さをチェックすると、それらがまったく同じ長さであることがわかります。

$fpath1 のデータを消去する方法を数多く試しました。私はそれをむしゃむしゃ食べます。非標準文字はすべて削除します。

$fpath1  =~ s/[^A-Za-z0-9\-\.\/]//g;

この:

my $safe_filepath_characters = "a-zA-Z0-9_.-/";
$fpath1 =~ s/[^$safe_filepath_characters]//g;

しかし、私が何をしても、 $fpath1 を使用するとエラーが発生し、 $fpath2 を使用すると機能します。

$fpath1 のデータのどこが間違っている可能性がありますか? $fpath2 と正常に比較されますが、等しくなく、視覚的にはまったく同じに見え、正確に同じ長さとして表示されますが、同じようには機能しません。

以下のファイルオープンブロックの場合。

$upload_dir = $fpath1 

CGIが見つからないかのように、CGIのロードが完全に失敗します(CGIスクリプトの構文エラーが原因であることがわかっています)。

$uplaod_dir = $fpath2   

ファイルのアップロードに成功しました

$uplaod_dir = ""        

cgi の呼び出しは失敗せず、予想どおり、以下の if の else ブロックを実行します。

ファイルオープンブロックは次のとおりです。

if (open ( UPLOADFILE, ">$upload_dir/$filename" ))   
{
binmode UPLOADFILE;

while ( <$upload_filehandle> )
{
print UPLOADFILE;
}

close UPLOADFILE;
$msgstr="Done with Upload: upload_dir=$upload_dir filename=$filename";
}
else
{
$msgstr="ERROR opening for upload: upload_dir=$upload_dir filename=$filename";
}

ハードコーディングされた同等の $fpath2 と同じように機能しない理由を見つけるために、$fpath1 に対して他にどのようなテストを実行する必要がありますか?

$fpath2 から $fpath1 に、一度に 1 文字ずつ文字置換を試みました。単一の文字でこれを行っても、文字はまったく同じように見えますが、$fpath1 は $fpath2 と同じエラーになります。

4

2 に答える 2

0

あなたの CGI はおそらく-T(汚染モード) スイッチ (例えば )で perl を実行してい#!/usr/bin/perl -Tますか? その場合、信頼されていないソース (ユーザー入力、URI、フォーム フィールドなど) からの値はopen、正規表現キャプチャを使用して汚染が取り除かれるまで、 などのシステム操作で使用できません。s///を使用してその場で変更しても、値は汚染されないことに注意してください。

$fpath1  =~ /^([A-Za-z0-9\-\.\/]*)$/;
$fpath1 = $1;
die "Illegal character in fpath1" unless defined $fpath1;

汚染モードが問題の場合は機能するはずです。

于 2013-04-03T22:07:16.313 に答える