注意:JavaScript的正则表达式跟.net的正则表达式有些差异。

这两天,CSDN出现了有人注册中文ID的情况,CSDN 是不允许正常途径注册中文ID的,为此在注册页面专门用 asp:regularexpressionvalidator 作了限制,服务器端专门用 IsValid 作了判断。

通过联系网友,网友反馈是:是通过禁用客户端禁用所有js来实现注册中文名的。但我们是服务器端有校验的呀。一直查下去,发现是正则表达式写错了。写成了 ValidationExpression="/w+"

如下禁用所有JS。

禁用所有JS的设置 

查询MSDN的帮助,对 /w 有以下描述:

与任何单词字符匹配。等效于 Unicode 字符类别 [/p{Ll}/p{Lu}/p{Lt}/p{Lo}/p{Nd}/p{Pc}]。如果用 ECMAScript 选项指定了符合 ECMAScript 的行为,则 /w 等效于 [a-zA-Z_0-9]。

晕倒,我以前看的几本书可没有这么说。反查一些关于正则表达式的书,晕倒,很多在对 /w 进行说明的时候,写得就是匹配任一单词字符,包括 A-Z、a-z、0-9和下滑线_ ,而没有提到 Unicode这部分。晕倒,被书害了。

而上面的说法,是JS的说法,以前学习这部分的时候,只是注意看书本内容,没注意看MSDN,害的出了这么一个大漏洞。

把正则表达式修改为: ^[a-zA-Z0-9_]+$  就修正了这个问题。

置于为啥禁用掉JS,就可以注册中文,原因如下:

如果采用 /w+ 来校验的话:

如果客户端没有禁用JS,在js 这一层的校验,其实是校验的是 [a-zA-Z_0-9] ,
如果用户禁用了JS,在服务器端,它实际是校验的  [/p{Ll}/p{Lu}/p{Lt}/p{Lo}/p{Nd}/p{Pc}]
这样服务器端中文的用户名也校验通过了。

置于在CSDN注册的中文ID,按照CSDN的制度,所有利用非正常途径、CSDN漏洞获得的利益,CSDN都不给与保护。除了少数几个帮助CSDN解决问题的帐号被保留外,其他都会被删除。

阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭