84669 Lernen von Personen
152542 Lernen von Personen
20005 Lernen von Personen
5487 Lernen von Personen
7821 Lernen von Personen
359900 Lernen von Personen
3350 Lernen von Personen
180660 Lernen von Personen
48569 Lernen von Personen
18603 Lernen von Personen
40936 Lernen von Personen
1549 Lernen von Personen
1183 Lernen von Personen
32909 Lernen von Personen
在PHP网站中,怎样防止别有用心的人注册跟其他用户不易分辨的用户名?
比如0和O,1和I或者l,5和S,Z和2等,另外包括但不限于使用希腊字母,西里尔字母,俄文字母或者其他拉丁系语言的字母来高仿英文字母的,以及使用中日汉字里面看起来差异非常小的汉字(也可以使用差别不大的简繁体中文汉字在)作为高仿用户名。
怎样才能尽量避免这种情况发生?
拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...
我这里有一个 ·真· 防伪造用户名方案。
那就是用GD绘图画出两个用户名,然后用图片相似度算法算出匹配度。就知道是不是仿冒他人了。
我感冒了 vs 娃娃脾气
娃娃脾气 vs 哇哇脾气
shellus vs she11us
然后取出黑色部分的像素数量,即可得到两个文本的相似度了
'gd')); // imagick // to finally create image instances $img = $manager->canvas(800, 100, '#fff'); $img->text('蛙蛙脾气', 0, 0, function(\Intervention\Image\AbstractFont $font) { $font->file('src/fonts/msyhbd.ttc'); $font->size(100); $font->color('#000'); $font->valign('top'); }); $img->text('娃娃脾气', 0, 0, function(\Intervention\Image\AbstractFont $font) { $font->file('src/fonts/msyhbd.ttc'); $font->size(100); $font->color('#ff0'); $font->valign('top'); }); $img->save('bar.png');
这玩意儿,程序自动处理并不能完全解决问题,可以先用程序处理一遍,无法确定的就放入待定区进行人工审核。说一下我的思路:
如果用户名包含别人的用户名,比如原有abc,再注册一个abc123,这个就要毙掉了;
检测字符的编辑距离,php里面有个函数levenshtein可以看看;
其他特定相似字符的判断,建一个黑名单。
首先应当创建相似字符的对应表,即0与o的一个全量集合,这一块需要人工处理(可以使用更加高科技的手段,如果你会的话),然后创建用户名时首先允许他创建,然后定时任务的分析包含这些相似字符的用户进行匹配,然后封锁帐号,并要求其联系管理员解封
最初方案:
把用户名作正规化处理,例如0和o等价,就把Hell0正规化成Hello,规则多复杂都可以(大小写,vv转w之类)。
把正规化后的名字保存起来以便下次注册的时候判断(放数据库,Redis,实现个bloom filter都可以)
和 @娃娃脾气 思路相似的是感知哈希,用DCT hash效果还可以,但还是要解决搜索问题。
把这两个思路结合起来:
遍历字符集合,用图像相似性构造出字符的等价类(解决了规则构造的问题)
用户注册时根据等价类把用户名正规化,保存到bloom filter供下次注册判断(解决搜索问题)
这样避免感觉规则有点大,给id,昵称可以随意变
屏蔽这些字 不给注册
好吧,说一下本屌的思路,毕竟心有多大,需求就有多大
您需要建立一张表来存取可能匹配到的字段名,然后写一个字符匹配对照类,比如我Tom注册的时候,然后我发现这个o可能被人利用啊,顺带把T0m这个昵称放到新建的那个表上,同时绑定到新用户的id上,当然我这个从表一般只是用户注册或者更改昵称的时候查一下,有的话就提示这人注册了啊,别整成这样了
Tom
o
T0m
id
你做的应该是论坛社区之类的吧 如果想防止用户仿冒ID的情况发生不只是单单从用户ID上来区分 应该从用户头像 用户等级上也做出区分 一个完善的社区应该也包括这些 看看贴吧的也是允许高仿ID的 况且社区论坛都是弱关系社交 即使有高仿ID也不会出现什么情况 而且贴吧这么多用户量都不考虑这个高仿ID 一些小的论坛用户量更小 完全没必要考虑这个
说一个防止使用其他拉丁语系字母高仿英文字母的好方法,那就是:用正则表达式!但对于使用相似度很高的字母高仿数字(或相反),以及使用中日汉字(如果正则允许的话)之间微小差异的特点来注册的高仿ID无效。
这不是我的名字吗?有人仿冒我?
我这里有一个 ·真· 防伪造用户名方案。
那就是用GD绘图画出两个用户名,然后用图片相似度算法算出匹配度。就知道是不是仿冒他人了。
我感冒了 vs 娃娃脾气
娃娃脾气 vs 哇哇脾气
shellus vs she11us
然后取出黑色部分的像素数量,即可得到两个文本的相似度了
这玩意儿,程序自动处理并不能完全解决问题,可以先用程序处理一遍,无法确定的就放入待定区进行人工审核。说一下我的思路:
如果用户名包含别人的用户名,比如原有abc,再注册一个abc123,这个就要毙掉了;
检测字符的编辑距离,php里面有个函数levenshtein可以看看;
其他特定相似字符的判断,建一个黑名单。
首先应当创建相似字符的对应表,即0与o的一个全量集合,这一块需要人工处理(可以使用更加高科技的手段,如果你会的话),然后创建用户名时首先允许他创建,然后定时任务的分析包含这些相似字符的用户进行匹配,然后封锁帐号,并要求其联系管理员解封
最初方案:
把用户名作正规化处理,例如0和o等价,就把Hell0正规化成Hello,规则多复杂都可以(大小写,vv转w之类)。
把正规化后的名字保存起来以便下次注册的时候判断(放数据库,Redis,实现个bloom filter都可以)
和 @娃娃脾气 思路相似的是感知哈希,用DCT hash效果还可以,但还是要解决搜索问题。
把这两个思路结合起来:
遍历字符集合,用图像相似性构造出字符的等价类(解决了规则构造的问题)
用户注册时根据等价类把用户名正规化,保存到bloom filter供下次注册判断(解决搜索问题)
这样避免感觉规则有点大,给id,昵称可以随意变
屏蔽这些字 不给注册
好吧,说一下本屌的思路,毕竟心有多大,需求就有多大
您需要建立一张表来存取可能匹配到的字段名,然后写一个字符匹配对照类,比如我
Tom
注册的时候,然后我发现这个o
可能被人利用啊,顺带把T0m
这个昵称放到新建的那个表上,同时绑定到新用户的id
上,当然我这个从表一般只是用户注册或者更改昵称的时候查一下,有的话就提示这人注册了啊,别整成这样了你做的应该是论坛社区之类的吧 如果想防止用户仿冒ID的情况发生不只是单单从用户ID上来区分 应该从用户头像 用户等级上也做出区分 一个完善的社区应该也包括这些 看看贴吧的也是允许高仿ID的 况且社区论坛都是弱关系社交 即使有高仿ID也不会出现什么情况 而且贴吧这么多用户量都不考虑这个高仿ID 一些小的论坛用户量更小 完全没必要考虑这个
说一个防止使用其他拉丁语系字母高仿英文字母的好方法,那就是:
用正则表达式!
但对于使用相似度很高的字母高仿数字(或相反),以及使用中日汉字(如果正则允许的话)之间微小差异的特点来注册的高仿ID无效。
这不是我的名字吗?有人仿冒我?