在PHP中将utf-8字符列入白名单的最有效方法是什么?

Que*_*ner 2 php regex security whitelist utf-8

我的目标是通过为从客户端接收的任何和所有POST数据创建一个严格的允许字符白名单来保护我的网站免受攻击。

当停留在ASCII字符内时,这是小菜一碟。就像是:

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

但是,我需要能够允许任何和所有utf-8字符,尤其是亚洲字符集,例如日语,中文和韩语。但我不想排除任何古怪的字符,例如阿拉伯文或俄文,或其他。一个世界,一个爱!;)

我如何允许人们输入自己的母语字符,同时排除邪恶的脚本中使用的鼻音,例如*,?,尖括号等?

sim*_*mon 5

\w会给您单词字符(字母,数字和下划线),这可能是您追求\s的空白。

例如

if(preg_match('/[\w\s]/', $stringToTest))
{
   // Battle stations!!
}
Run Code Online (Sandbox Code Playgroud)

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);
}
Run Code Online (Sandbox Code Playgroud)

要获得所有可能逃逸和其他黑帽问题的信息,请使用:

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

要么

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

另一个很好的链接