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

标签 php regex security utf-8 whitelist

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

留在 ASCII 字符中时,这是小菜一碟。像这样的东西:

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

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

我怎样才能允许人们输入他们母语的字符,同时排除邪恶脚本中使用的脏字,如 *、?、尖括号等?

最佳答案

\w 将为您提供单词字符(字母、数字和下划线),这可能是您在 \s 之后寻找空格的原因。

例如

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

regular-expressions.info是这方面的极好引用 - herehere是几个相关的页面:)

编辑:需要更多说明,抱歉!

这是我通常使用的 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{标点符号}]/ ( == /[^\p{P}]/ )

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

another good link

关于php - 在 PHP 中将 utf-8 字符列入白名单的最有效方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5074161/

相关文章:

正则表达式搜索子字符串

python - 内容处置安全

sql - SQL 注入(inject)漏洞中的奇怪格式?

php - Stmt 不工作

php - MySQL 整数字段在 PHP 中作为字符串返回

javascript - 单击 div 而不是点击提交然后传递参数

java - Java 正则表达式的另一种模式

php - 国家文化国旗数据库导出?

php - 如何更改链接 (an) 元素中的 href (url)?

java - Client Cross Frame Scripting Attack解决方案