我正在为Node(express)中的字符串输入开发一个非常粗略的清洁剂:
我已经看了一些插件和库,但似乎大多数都太复杂或太重了。因此我决定自己写一些简单的消毒剂功能。
其中一个是这个,用于对大多数字符串进行硬消毒(不是数字......)
function toSafeString( str ){
str = str.replace(/[^a-öA-Ö0-9\s]+/g, '');
return str;
}
我来自瑞典,因此我需要åäö字母。而且我注意到这个正则表达式也接受了其他的charachters以及...例如á或é....
问题1) 是否有某种列表或类似的地方,我可以看到实际上接受了哪些字符,比如这个正则表达式:/ [^ a-ö] + / g
问题2) 我在Node和Express工作......我认为这个简单的功能将通过输入字段阻止攻击。我错了吗?
答案 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);
}
请记住,这是缺少的字符:
:*()&#'\-:%
还有更多其他人。