2

我正在为 Node(express) 中的字符串输入开发一种非常粗糙的消毒剂:

我浏览了一些插件和库,但似乎它们中的大多数要么太复杂,要么太重。因此,我决定自己编写几个简单的消毒功能。

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

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

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

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

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

4

3 回答 3

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:您希望阻止哪些攻击?无论哪种方式,答案都是“不,可能不是”。

不要修改用户数据(我相信你的,比如说,法国或日本的客户会对你的验证有意见),确保在数据进入或退出客户视图时对其进行清理(HTML 转义,SQL 参数转义, ETC。)。

于 2013-09-12T14:41:38.373 回答
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);
}

请记住,这是缺少字符,例如:

:*()&#'\-:%

还有更多其他人。

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

请参阅字符表以供参考。

为了您的验证,您可能想要这样的东西:

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

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

于 2013-09-12T14:45:12.907 回答