2

まあ、私は試みて失敗したので、ここに再びいます。

腹筋のパス パターンを一致させる必要があります。

 /public_html/mystuff/10000001/001/10/01.cnt

私は汚染モードなどです..

#!/usr/bin/perl -Tw
use CGI::Carp qw(fatalsToBrowser);
use strict;
use warnings;
$ENV{PATH} = "bin:/usr/bin";
delete ($ENV{qw(IFS CDPATH BASH_ENV ENV)});

同じファイルを 2 回以上開く必要があり、毎回ファイル名の汚染を取り除かなければなりません。他に間違ったことをしているかもしれませんが、今後の参考のために、このパターンを構築するための支援が必要です。

my $file = "$var[5]";
if ($file =~ /(\w{1}[\w-\/]*)/) {
$under = "/$1\.cnt";
} else {
ErroR();
}

私の初心者の試みから、私が無知に近いことがわかります。

$1うまく構築されていないが機能している正規表現のため、スラッシュと拡張子を追加する必要がありました。

だから、表現を修正する方法を学ぶ助けが必要です$1/public_html/mystuff/10000001/001/10/01.cnt

誰かがここで私の手を握って、作り方を教えてくれませんか?

$file =~ /(\w{1}[\w-\/]*)/ 私の絶対パスと一致します/public_html/mystuff/10000001/001/10/01.cntか?

ご協力ありがとうございます。

4

2 に答える 2

7

編集:ファイル名の末尾に$一致する可能性があるため、(以前に行ったように) パターンで使用することはお勧めできません。文字列の末尾に明確に一致するため、代わりに\n使用してください。\z

一致させるものをできるだけ具体的にしてください。

my $fn = '/public_html/mystuff/10000001/001/10/01.cnt';

if ( $fn =~ m!
    ^(
        /public_html
        /mystuff
        /[0-9]{8}
        /[0-9]{3}
        /[0-9]{2}
        /[0-9]{2}\.cnt
     )\z!x ) {
     print $1, "\n";
 }

別の方法として、共通の接頭辞であると私が想定しているものを'/public_html/mystuff'変数に入れ、構成要素でさまざまなコンポーネントを組み合わせてqr//( perldoc perlopを参照)、条件演算子を使用することで、コードが占める垂直方向のスペースを減らすことができ?:ます。

#!/usr/bin/perl

use strict;
use warnings;

my $fn = '/public_html/mystuff/10000001/001/10/01.cnt';
my $prefix = '/public_html/mystuff';
my $re = qr!^($prefix/[0-9]{8}/[0-9]{3}/[0-9]{2}/[0-9]{2}\.cnt)\z!;

$fn = $fn =~ $re ? $1 : undef;

die "Filename did not match the requirements" unless defined $fn;
print $fn, "\n";

また、あなたのように相対パスを使用して調整することはできません

$ENV{PATH} = "bin:/usr/bin";

汚染モードを使用して。もしかして

$ENV{PATH} = "/bin:/usr/bin";
于 2009-10-13T19:48:35.637 に答える
6

毎回、ファイル パスの汚染を除去することについて話します。これはおそらく、プログラムのステップを区分化していないためです。

一般的に、私はこの種のプログラムをいくつかの段階に分けます。初期段階の 1 つはデータ検証です。プログラムを続行する前に、できる限りすべてのデータを検証します。いずれかが私の期待に合わない場合は、プログラムを続行させません。何か重要なこと (データベースに何かを挿入するなど) の途中で何かが間違っていることを発見したくはありません。

そのため、データを取得したら、すべてのデータを untaint し、値を新しいデータ構造に保存します。その後、元のデータや CGI 関数を使用しないでください。CGI モジュールは、プログラムにデータを渡すためのものです。その後、プログラムの残りの部分は、CGI についてできるだけ知識を持たないようにする必要があります。

あなたが何をしているのかわかりませんが、ほとんどの場合、実際のファイル名を入力として受け取るのはデザインの匂いです。

于 2009-10-13T22:15:44.717 に答える