最近使用了iWebSns,刚建站没几天,已经出现了好多个恶意注册的用户,通常用户名都是杂乱的字符加数字。
首先我先试着进入后台管理关闭注册,可是过两天发现恶意代码仍然可以注册成功,可见其完全没有通过注册页面注册。
嗯,这好办,加一个Session,凡是不通过页面,站外提交注册的一律禁止。方法如下:
1.修改iwebsns根目录下面的 modules.php 在第五行后面添加
//设置SESSION防止站外提交
$_SESSION["postFlag"]="acctc";
2.修改 /action/reg_act.php 添加判断session是否存在的语句。
大概在第104行,红色为添加内容
//写入数据 ,判断session是否存在,禁止站外提交
if(session_is_registered("postFlag")){
$user_ico=($user_sex==0)?"skin/$skinUrl/images/d_ico_0_small.gif":"skin/$skinUrl/images/d_ico_1_small.gif";
dbtarget('w',$dbServs);
$sql="insert into $t_users (user_name,user_pws,user_sex,user_email,user_add_time,user_ico,invite_from_uid,is_pass,lastlogin_datetime,birth_year , birth_month , birth_day ,login_ip )"
." values('$user_name','$user_pws',$user_sex,'$user_email','".constant('NOWTIME')."','$user_ico',$invite_fromuid,$is_pass,'".constant('NOWTIME')."','','','','$_SERVER[REMOTE_ADDR]')";
if(!$dbo->exeUpdate($sql)){
action_return(0,$re_langpackage->re_reg_false,"-1");
}
这种方法限制了站外提交,但仍然有部分恶意注册不能避免。
于是想到注册机通常生成随即的用户名,以避免重名用户导致注册失败,生成的用户名通常都是字符+数字的组合。
那么我限制用户只能用中文注册,是否就可以避免垃圾注册了呢?
方法如下:
1.修改 /action/reg_act.php文件,增加判断用户名是否中文的代码。
.........
if(strlen(get_argp("user_name"))<4){
action_return(0,$re_langpackage->re_right_name,"-1");
}
//检查用户名必须是全中文
$namestr = get_argp("user_name");
if(!preg_match("/^[\x{4e00}-\x{9fa5}]+$/u",$namestr)) {
action_return(0,$re_langpackage->re_right_name,"-1");
}
2.修改iwebsns的模版文件 /templates/default/modules/users/user_reg.html
把javaScript脚本修改验证只允许输入中文,红色为修改部分
// 检测会员用户名
var user_name = document.getElementsByName('user_name')[0];
var user_name_message = $('user_name_message');
var user_name_status = false;
var user_name_reg = /^[\u4E00-\u9FA5]*$/; //用正则表达式/[\u4E00-\u9FA5]/表示中文
3.修改语言包中的提示,在 /langpackage/zh/users.php 中。
自此,对iwebsns 防止恶意注册,防止垃圾灌水的修改完毕,实际使用效果还不错,
演示地址:www.acctc.com