CGIスクリプトへの入力を検証して安全にシェルに渡すことができますか?私はPerlと複雑な正規表現の両方に新しいです。以前は正規表現の*を使っていましたが、それより複雑なものはありません。下のスクリプトでは、非常に大きなセキュリティホールがあり、perlコードを注入して実行できるので、どのコマンドもシェルでも実行できるようになっています。この注射をやめようとする中で、私は正規表現が私が思っていたよりもはるかに難しいことに気づきました。=~/^\w+$/);私は、これは、ユーザーからの入力が複数の単語で始まらなければならないことを意味していると確信していますが、セミコロンをチェックすることがないため、コマンドの注入を停止する方法がわかりません。unless節はもっと似ているべきだと思いますunless($user=~/^\w+;\w$/);しかしどちらもうまくいかない。私は本当にこれを理解したいので、これに関する助けは素晴らしいだろう。ar「複数の単語」ではありません。文字A-Z、a-z、0-9、およびアンダースコアだけで構成されていない限り「死ぬ」です。"if"の反対であると考えるならば意味があります。'_'と一致すると言っています。$/と一致しないはずです。Sinanの使用警告のような提案に従うと、本当の問題が見つかるはずです。源@アキ私はjoeshmoを試しています。-l;私はそれが許されてはならないと信じています。単語の文字ではありませんが、とにかく通り抜けています。答えまず、問題を引き起こしている声明を見てみましょう。stringしたがって、コードは、有効なユーザー名文字列とみなされます。それには2つの問題があります:まず、改行で文字列を受け入れるつもりではないかと思います。使用して文字列の終わりを明白に意味します。大きなセットと一致します。他のスイッチがなければ、さまざまな言語の多くの他の単語文字に一致することができます。**単語の文字を参照してください。$/は単語文字を含む入力と一致します。セミコロン、および末尾の単語の文字、場合によっては改行が含まれます。世界はいくつかの頭痛。Webサーバーのログにアクセスできない場合は、短期間のクラッチを使用してください。提供されるHTML生成メソッドを使用して、いくつかのHTMLを出力します。提供される生成メソッド。テンプレートパッケージを使用してください。HTMLコンテンツから。行に沿った何かスクリプトが動作するはずです。Ünür源もう一つの重要な点はここにあります。あなたのコードは、セミコロンで区切られた2つの英数字のシーケンス以外の何かを許可します。2つのセミコロンと他の英数字以外の文字が含まれているため、プログラムの完全な有効な入力です。ここでの一般的な原則は、「悪い」入力を拒否するのではなく、「良い」入力を一般的にテストし、受け入れるだけでよいということです。ここは、このトピックに関する多くの良い記事の1つです。条件がfalseの場合、プログラムは終了します。正規表現にはフラグが設定されています。フラグは設定されていません。源@ジム・デイビス:それはUnicodeとは無関係です。源@SinanÜnür:あなたは改行の後ろについています。私はそれに対応して答えを更新しました。テキストでより顕著にしました。waaaayyyyyyyyyyyと一致します。プログラマーのインテントは、単語の文字だけを通すことです。使用する必要があります。それが意味すると思われるものを意味しないという潜在的な問題もあります。$/"の場合にはq(一致)を表示します。"一致"を示しています。$/は改行で終わる文字列と一致しているようです。意見の相違について頭を悩まし、それを逆戻りして読んだ。