2

私の目標は、クライアント側から受信したすべてのPOSTデータに対して許可される文字の厳密なホワイトリストを作成することにより、Webサイトを攻撃から保護することです。

これは、ASCII文字の範囲内にとどまるときの簡単なことです。何かのようなもの:

if(preg_match('/[^aA-zZ0-9]/', $stringToTest))
{
   // Battle stations!!
}

ただし、すべてのutf-8文字、特に日本語、中国語、韓国語などのアジア文字セットを許可できる必要があります。しかし、アラビア語やロシア語などの風変わりな文字を持っている人を除外したくありません。一つの世界、一つの愛!;)

*、?、山かっこなどの邪悪なスクリプトで使用される厄介なものを除外しながら、人々が母国語の文字を入力できるようにするにはどうすればよいですか?

4

4 に答える 4

5

\w単語の文字(文字、数字、アンダースコア)が表示されます。これは、おそらく\s空白を求めているものです。

例えば

if(preg_match('/[\w\s]/', $stringToTest))
{
   // Battle stations!!
}

regular-expressions.infoは、このようなものの優れたリファレンスです。ここここに、関連するページがいくつかあります:)

編集:もう少し説明が必要です、ごめんなさい!

これが私が通常CJKに使用するものです:

function get_CJK_ranges() {

    return array(
                "[\x{2E80}-\x{2EFF}]",      # CJK Radicals Supplement
                "[\x{2F00}-\x{2FDF}]",      # Kangxi Radicals
                "[\x{2FF0}-\x{2FFF}]",      # Ideographic Description Characters
                "[\x{3000}-\x{303F}]",      # CJK Symbols and Punctuation
                "[\x{3040}-\x{309F}]",      # Hiragana
                "[\x{30A0}-\x{30FF}]",      # Katakana
                "[\x{3100}-\x{312F}]",      # Bopomofo
                "[\x{3130}-\x{318F}]",      # Hangul Compatibility Jamo
                "[\x{3190}-\x{319F}]",      # Kanbun
                "[\x{31A0}-\x{31BF}]",      # Bopomofo Extended
                "[\x{31F0}-\x{31FF}]",      # Katakana Phonetic Extensions
                "[\x{3200}-\x{32FF}]",      # Enclosed CJK Letters and Months
                "[\x{3300}-\x{33FF}]",      # CJK Compatibility
                "[\x{3400}-\x{4DBF}]",      # CJK Unified Ideographs Extension A
                "[\x{4DC0}-\x{4DFF}]",      # Yijing Hexagram Symbols
                "[\x{4E00}-\x{9FFF}]",      # CJK Unified Ideographs
                "[\x{A000}-\x{A48F}]",      # Yi Syllables
                "[\x{A490}-\x{A4CF}]",      # Yi Radicals
                "[\x{AC00}-\x{D7AF}]",      # Hangul Syllables
                "[\x{F900}-\x{FAFF}]",      # CJK Compatibility Ideographs
                "[\x{FE30}-\x{FE4F}]",      # CJK Compatibility Forms
                "[\x{1D300}-\x{1D35F}]",    # Tai Xuan Jing Symbols
                "[\x{20000}-\x{2A6DF}]",    # CJK Unified Ideographs Extension B
                "[\x{2F800}-\x{2FA1F}]"     # CJK Compatibility Ideographs Supplement
    );

}

function contains_CJK($string) {
    $regex = '/'.implode('|',get_CJK_ranges()).'/u';
    return preg_match($regex,$string);
}

エスケープやその他のブラックハットで問題になる可能性のあるものをすべて取得するには、次を使用します。

/[^\p{Punctuation}]/(== /[^\p{P}]/

また

/[^\32-\151]/(== /[^!-~]/

別の良いリンク

于 2011-02-22T05:01:16.243 に答える
2

base64でエンコードできるものもありますが、すべての文字を保持することがより重要であり、今のところこれ以上の時間の価値がないため、実行できない機能を少し削除する必要がありました.

...

私がこれに出くわしたと言った後、一般的な機能が必要な場合、非常に多くの文字のために問題が効率的になるようですが、それは大きな問題ではありません(中国語、ロシア語、ギリシャ語には別々のWebページなどがあります)。

http://www.php.net/manual/en/regexp.reference.unicode.php .

于 2011-04-02T00:08:51.567 に答える
0

この方法で何かを保護できるとは思えません。
公正なユーザーにとって問題を複雑にするだけですが、悪意のあるユーザーを止めないでください。

疑問符や引用符、または電子メールを入力できないサイトをやめるだけです。
単純なドットは、確かに「邪悪なスクリプトで使用される厄介なもの」の 1 つです。しかし、それなしのメッセージは醜く見えます。

SQL インジェクションはアルファベット文字のみを使用して実行できます。

そのような「保護」には意味がありません。

于 2011-02-22T07:43:35.173 に答える
0

テストを逆にしてみてください - ホワイトリストの代わりにブラックリストを使用してください。例えば

if(preg_match('/[\*\?<>]/', $stringToTest))
{
    // Battle stations!!
}

正規表現はまったく正しくないかもしれませんが、おわかりいただけたでしょうか。

于 2011-02-22T04:59:04.603 に答える