问题描述
|
我希望能够将用户输入限制为有效字符的白名单,但我不想阻止来自其他文化背景的人注册。
到目前为止,我有这个:
^[a-zA-Z0-9èéêëàáâãäçìíîïòóôõöùúûü-_]*$
它可以使用大多数法语口音,但是拉丁字符集中的口音列表为IMMENSE!如果我错过了某些事情,我宁愿使用白名单而不是黑名单。
注意,这将用于C#,但是我想使用正则表达式进行客户端验证,使双方都保持一致。当我将输入也保存到数据库时,我正在对输入进行HTML编码。
是否有一种更精美的方法使正则表达式不敏感,但仍具有足够的限制性以防止XSS?我不想疏远我的用户。
我希望能够有一些标点符号,但不希望自己受到XSS攻击,例如,我希望有人输入他们的公司名称:如果有人在Yahoo!工作,他们应该可以注册。
解决方法
^\\w+$
您不能只使用字母数字标志,我相信您可以接受这些重音符号。
,也许您可以使用unicode范围,例如[\\ u00C0-\\ u017E]适当地覆盖所有重音基础(但是您应该检查字符映射表以确保正确,因为我不知道意大利语具有什么重音)。
,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”将覆盖所有这些内容。参见http://www.regular-expressions.info/charclass.html
,如果要允许字母(带或不带变音符号)和一些标点符号,可以使用:
^[\\w_-]+$
其中\\ w代表任何字母,而_-是允许的2个允许的额外标点符号。不要忘记使用-结尾。
,对于用户输入的订购单,我正在使用以下格式:[^ \\ w \\ s + \\ /_,.@-]
这允许电子邮件,邮政编码,名字,姓氏等字符。