用于输入验证的正则表达式白名单 - 不区分重音
Posted
技术标签:
【中文标题】用于输入验证的正则表达式白名单 - 不区分重音【英文标题】:Regex white list for input validation - accent insensitive 【发布时间】:2011-08-05 15:40:15 【问题描述】:我希望能够将用户输入限制为有效字符的白名单,但我不想阻止来自其他文化的人注册。 到目前为止,我有这个:
^[a-zA-Z0-9èéêëàáâãäçìíîïòóôõöùúûü-_]*$
它允许大多数法语口音,但拉丁字符集中的口音列表是巨大的!我宁愿使用白名单而不是黑名单,以防我错过了什么。
注意,这将适用于 C#,但我想使用正则表达式进行客户端验证,以使双方保持一致。当我将输入保存到数据库时,我也在对输入进行 html 编码。
是否有更优雅的方法可以使正则表达式重音不敏感,但仍具有足够的限制性以防止 XSS?我不想疏远我的用户。
我希望能够有一些标点符号,但不要让自己受到 XSS 攻击,例如,我希望有人输入他们的公司名称:如果有人在 Yahoo! 工作,他们应该能够注册。
【问题讨论】:
ECMAscript RegExp 类不支持 unicode,超出 \u.... 转义以匹配单个代码点:[ECMA-262 标准][1]。例如,\w
转义只包括 ASCII 字母和数字,加上“_”。 [1]:ecma-international.org/publications/files/ECMA-ST/ECMA-262.pdf
我是不是走错了路?我想更广泛的问题是在服务器端防止 XSS 的最佳验证是什么(而不是简单地对所有内容进行 HTML 编码)?
我将把服务器端功能拆分为一个只用于字母数字,一个用于标点符号。感谢您的帮助!
【参考方案1】:
也许你可以使用像 [\u00C0-\u017E] 这样的 unicode 范围来覆盖所有重音基数(但你应该检查字符映射以确保,因为我不知道意大利语有什么口音)。
【讨论】:
您可以在此处查看它接受的内容:en.wikipedia.org/wiki/…,也许可以根据您自己的需要进行更改。我的示例仅涵盖重音字母。你仍然需要做 A-z0-9【参考方案2】:fwiw:我使用了一个自制函数,它为所有变音符号返回一个正则表达式:
function diacritsRegEx(global, caseinsitive, multiline)
var modifiers = (global ? 'g' : '')
+ (multiline ? 'm' : '')
+ (caseinsitive ? 'i' : '');
return new RegExp(
['[\\.\\-a-z\\s]|', // [a-z, . - and space]
'[\\300-\\306\\340-\\346]|', // all accented A, a
'[\\310-\\313\\350-\\353]|', // all accented E, e
'[\\314-\\317\\354-\\357]|', // all accented I, i
'[\\322-\\330\\362-\\370]|', // all accented O, o
'[\\331-\\334\\371-\\374]|', // all accented U, u
'[\\321-\\361]|', // all accented N, n
'[\\307-\\347]' // all accented C, c
]
.join(''), modifiers);
【讨论】:
【参考方案3】:^\w+$
你不能只使用字母数字标志,我相信它接受重音符号。
【讨论】:
我在运行时遇到这个错误:解析 "^\w+*$" - 嵌套量词 * @Dave,我确定他的意思是^\w+$
或 ^\w*$
。这只是一个拼写错误。
对不起,我是个正则表达式菜鸟:S
我喜欢\w,但是如何选择性地添加一些标点符号呢?
@Dave,把标点写在后面就好了。说你想要一个单词然后是句号:【参考方案4】:
在一些正则表达式实现中,一个简单的\w
将涵盖所有这些。见http://www.regular-expressions.info/charclass.html
【讨论】:
【参考方案5】:如果您想允许使用字母(带或不带变音符号)和一些标点符号,您可以使用:
^[\w_-]+$
其中 \w 代表任何字母,_- 是 2 个允许的额外标点符号。不要忘记把 - 放在最后。
【讨论】:
【参考方案6】:对于订单表格中的用户输入,我使用的是:[^\w\s+\/_,.@-] 这允许电子邮件、邮政编码、名字、姓氏等字符。
【讨论】:
以上是关于用于输入验证的正则表达式白名单 - 不区分重音的主要内容,如果未能解决你的问题,请参考以下文章