正規表現(regex)のエラー使用による機能的な脆弱性の分析
前に書いたら
正規表現は、その強力な文字列マッチング機能により、現在は様々なプログラム言語で非常に人気があります。これは、ある構文規則に適合する一連の文字列を記述または一致させるために使われます。正規表現を使ったばかりの多くはこれを聞いてから使いたい時にネットで検索します。最初から正規表現を体系的に学習し、定義原理からシステムを使って学習する人は少ないです。初心者に対応するのは面倒くさいと思います。長い文字列を見て、頭が痛いです。ですから、勉強するのもおっくうです。普通問題があったら、直接インターネットで検索します。例えば、「メールアドレス正規表現、携帯番号正規表現、url正規表現…」という興味深い現象を発見しました。
それぞれの正則表現から2つの結論を出すことができます。一、正規表現は柔軟で、複数の方法で同じ結果を達成できます。二、正規表現のマッチング結果は検証が必要です。複雑な正規表現はミスマッチを生じやすいです。ここでは正則表現の柔軟性については説明しませんが、一般的な正規表現の誤用を見て、機能的な脆弱性の例を作成します。私たちが使う時は注意してください。以下の例は私の仕事の中からコードを審査して、いつも例が現れて、友達をも歓迎して補充します。
デリミタ'^''はバグがありません。
このようによくします。携帯番号、メールボックス、url、ログイン名、パスワードなどです。限定マークが必要です。
四角い括弧の文字[]の中の文字はBugを使用します。
正規表現では、正規表現の元文字(.*?など)四角い括弧の中では普通の文字になります。四角い括弧の中で、特殊な文字を表しています。「^-\」の3文字だけが特殊な文字です。この中で、「^」の文字は、左の括弧の最初の文字の場合、後ろのすべての文字の中にない文字を表します。
例えば:[^0]は0文字ではありません。もしそうなら、[0^]は0^文字を含むことを表します。左括弧の一番右の文字ではないからです。もう普通の字と同じです。「-」文字の代表は範囲文字です。例えば、[0-9]は0から9の直接文字にマッチしています。\"変換記号は、マッチしたいなら"-"文字は、[0\-9]とマッチするなら"\"となります。というのは、多くの友達が四角い括弧を使う時、特殊な文字を間違えるからです。
はい、今日は整理します。よくある正規表現とよくある間違いです。みんなの交流を歓迎します。
正規表現は、その強力な文字列マッチング機能により、現在は様々なプログラム言語で非常に人気があります。これは、ある構文規則に適合する一連の文字列を記述または一致させるために使われます。正規表現を使ったばかりの多くはこれを聞いてから使いたい時にネットで検索します。最初から正規表現を体系的に学習し、定義原理からシステムを使って学習する人は少ないです。初心者に対応するのは面倒くさいと思います。長い文字列を見て、頭が痛いです。ですから、勉強するのもおっくうです。普通問題があったら、直接インターネットで検索します。例えば、「メールアドレス正規表現、携帯番号正規表現、url正規表現…」という興味深い現象を発見しました。
それぞれの正則表現から2つの結論を出すことができます。一、正規表現は柔軟で、複数の方法で同じ結果を達成できます。二、正規表現のマッチング結果は検証が必要です。複雑な正規表現はミスマッチを生じやすいです。ここでは正則表現の柔軟性については説明しませんが、一般的な正規表現の誤用を見て、機能的な脆弱性の例を作成します。私たちが使う時は注意してください。以下の例は私の仕事の中からコードを審査して、いつも例が現れて、友達をも歓迎して補充します。
デリミタ'^''はバグがありません。
<?php
/// ,
$user="chengmo8";
if(!preg_match("<strong>/[0-9a-zA-Z]+/</strong>",$user))
{
exit(" !");
}
これはよく見られます。デリミタがないので、正規表現の検索は$userから左から右に検索され、条件を満たす文字が見つかるとマッチングしてtrueに戻り、プログラムは続行されます。私達はテストして、ユーザー名の入力:chengmo 8、chengmo 8?!chengm、中国cadadfは全部成功にマッチできます。文字に数字のユーザー名しか制限できないようです。実際には、定則表現が不足していますので、文字列に数字を入れると登録できます。私達が必要なのは、最初から最後まで文字列はアルファベットで数字を加えなければなりません。正規表現は「^[0-9 a-zA-Z]」+$というシンプルな表現です。最初から最後までの文字のマッチングをするときは、忘れないでください。入力文字の先頭にマッチし、入力文字の終端にマッチする(デフォルトの改行前)このようによくします。携帯番号、メールボックス、url、ログイン名、パスワードなどです。限定マークが必要です。
四角い括弧の文字[]の中の文字はBugを使用します。
正規表現では、正規表現の元文字(.*?など)四角い括弧の中では普通の文字になります。四角い括弧の中で、特殊な文字を表しています。「^-\」の3文字だけが特殊な文字です。この中で、「^」の文字は、左の括弧の最初の文字の場合、後ろのすべての文字の中にない文字を表します。
例えば:[^0]は0文字ではありません。もしそうなら、[0^]は0^文字を含むことを表します。左括弧の一番右の文字ではないからです。もう普通の字と同じです。「-」文字の代表は範囲文字です。例えば、[0-9]は0から9の直接文字にマッチしています。\"変換記号は、マッチしたいなら"-"文字は、[0\-9]とマッチするなら"\"となります。というのは、多くの友達が四角い括弧を使う時、特殊な文字を間違えるからです。
<?php
/// ,
$code = "";
/// .*?
preg_match("/[.*?]+/",$code);
/// a z 26
preg_match("/[a-z]+/",$code);
/// A z , ascii ,A z , 48
preg_match("/[A-z]+/",$code);
/// A z ascill ,16
preg_match("/[x41-x7A]+/",$code);
/// and
preg_match("/[and]/",$code);
/// , a,n,d ,
赤は常に誤って理解されていますが、andにマッチしたいだけで、いったん「[]」の文字が追加されると、すべての文字の集合文字として認識されます。任意の文字の中に登場すると、マッチできます。順序は関係ありません。これらにマッチする必要がある場合は、「and|bnd」などの文字列で、and文字列またはbnd文字列に一致します。文字は、文字列またはオペレータです。左右の連続文字列は、全体としてマッチします。はい、今日は整理します。よくある正規表現とよくある間違いです。みんなの交流を歓迎します。