正则表达式字符集 - 以及它们包含的内容

时间:2013-09-12 14:34:49

标签: javascript regex node.js express

我正在为Node(express)中的字符串输入开发一个非常粗略的清洁剂:

我已经看了一些插件和库,但似乎大多数都太复杂或太重了。因此我决定自己写一些简单的消毒剂功能。

其中一个是这个,用于对大多数字符串进行硬消毒(不是数字......)

function toSafeString( str ){
    str = str.replace(/[^a-öA-Ö0-9\s]+/g, '');
    return str;
}

我来自瑞典,因此我需要åäö字母。而且我注意到这个正则表达式也接受了其他的charachters以及...例如á或é....

问题1) 是否有某种列表或类似的地方,我可以看到实际上接受了哪些字符,比如这个正则表达式:/ [^ a-ö] + / g

问题2) 我在Node和Express工作......我认为这个简单的功能将通过输入字段阻止攻击。我错了吗?

3 个答案:

答案 0 :(得分:2)

问题1:找出答案。 :)

var accepted = [];
for(var i = 0; i < 65535 /* the unicode BMP */; i++) {
    var s = String.fromCharCode(i);
    if(/[a-ö]+/g.test(s)) accepted.push(s);
}
console.log(s.join(""));

输出

abcdefghijklmnopqrstuvwxyz{|}~ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³
´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö

在我的系统上。


问题2:您希望停止哪些攻击?无论哪种方式,答案都是&#34;不,可能不是&#34;。

不要破坏用户数据(我确定您的法国或日本客户会对您的验证有所了解),请确保在您的数据进入客户视图或外出时清理数据(HTML转义,SQL参数转义等)。

答案 1 :(得分:1)

[x-y]匹配unicode号介于x和y之间的字符:

charsBetween = function(a, b) { 
     var a = a.charCodeAt(0), b = b.charCodeAt(0), r = ""; 
     while(a <= b) 
         r += String.fromCharCode(a++); 
     return r 
}
charsBetween("a", "ö")

> "abcdefghijklmnopqrstuvwxyz{|}~ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö"

请参阅character tables以获取参考。

对于您的验证,您可能需要这样的东西:

 [^a-zA-Z0-9ÅÄÖåäö\s]

这匹配拉丁字母和数字的范围+列表中的单个字符。

答案 2 :(得分:1)

我们实际上不知道很多角色,比如日语或俄语等等 因此,考虑到它们,我们需要在正则表达式中使用Unicode范围而不是ASCII范围。

我附带了这个正则表达式,几乎覆盖了整个Unicode表的所有书写字母,加上一些更多的数字,以及其他几个用于标点符号的字符(中文标点符号已包含在Unicode范围内)。 很难涵盖所有内容,可能这个范围可能包含太多字符,包括“异国情调”字符(符号):

/^[\u0040-\u1FE0\u2C00-\uFFC00-9 ',.?!]+$/i

所以我用这种方式测试(必须不是空的):

function validString(str) {
  return str && typeof(str) == 'string' && /^[\u0040-\u1FE0\u2C00-\uFFC00-9 ',.?!]+$/i.test(str);
}

请记住,这是缺少的字符:

:*()&#'\-:%

还有更多其他人。