Discuz! X 安全之禁止用户非法访问后台

从dismall上看到的,原文在这里:

https://www.dismall.com/thread-9320-1-1.html

Discuz!默认的后台路径是 http://你的域名/admin.php

因此很多站长不希望后台直接暴露出来让一些不法用户尝试登陆后台,造成一些安全隐患;

隐藏后台路径一般有两种思路,第一种就是直接修改admin.php文件名称,但是这种方式,前后台要修改的文件比较多,包括所有第三方模版都要修改,而且还会造成有时候安装插件无法再使用问题;新一代黑客木马大都注意到修改admin.php名称的说。

另一种思路,就是对admin.php增加访问权限,这就是本文要讲的方法,具体操作如下:

三种修改方法按需要选择其中一种即可。

都是修改 admin.php文件

A. 必须在前台登录以后才能访问后台

在$discuz->init(); 下方加入代码

if(!$_G['uid']){
header('HTTP/1.1 404 Not Found');
header("status: 404 Not Found");
echo '404 Not Found';
exit;
}

 

B. 必须在前台登录且uid=1, 才可以访问后台

在$discuz->init();下方加入代码

if($_G['uid']!=1){
header('HTTP/1.1 404 Not Found');
header("status: 404 Not Found");
echo '404 Not Found';
exit;
}

C. 必须在前台登录了且uid在指定范围,才可以访问后台

在$discuz->init(); 下方加入代码

$uids=array(1,2,3,99);
if(in_array($_G['uid'],$uids)){
header('HTTP/1.1 404 Not Found');
header("status: 404 Not Found");
echo '404 Not Found';
exit;
}

修改完成后,非法直接访问后台的用户就直接报404错误了

Openwrt 默认LAN和WAN的顺序

只要你刷了Openwrt的官方镜像或者L大或者Lean大的程序,那么默认的话只有两个网卡,都是先lan,然后wan

换句话说,如果你买的是工控机软路由,那么无论是几个口,肯定eth0 是lan,eth1是wan,如果有eth2 和eth3的话,默认是没有是用的

如果你是在hyper-v上虚拟的软路由,那么你先添加的是哪个网卡,那个网卡就是lan,添加的第二个网卡就是wan,默认的说

内地居民临港开通银行账户的攻略

这个忘了是在哪看到的了,转过来做个记录,虽然大部分银行账户我都有了

本文仅介绍在香港和内地有影响力的大行,中资马甲行如民生、信银等在内地就能以一个很低的成本见证开到,无非就是没有什么服务,各种费用高,作为临时或短期使用完全可以,本文不再介绍。

本文用★的个数对各银行及其户口做综合评估,5星级银行★★★★★,这类银行及户口,一般具有往来汇款手续费低廉(免费),或两地转账秒到,或网银功能强大易用,或内地用户在线申请信用卡易批核等难以复制的优点,对于某项具体业务有需求的,强烈建议先开立5星银行户口。

第一类:非常好开的
这类银行没啥好说的,完全是中资银行的马甲,主要客群就是内地人,比较缺客户,所以开户非常容易,先预约,直接去开就行了,不过服务就非常一般了,多数银行还有账户最低结余的收费。

代表银行:永隆银行★★★(独特优势:银证转账功能强大;给香港AE信用卡还款,次日即到),招行银行香港分行★★等。

开户姿势:先预约(可以是网银或APP上预约,也可以电话预约,预约时可以提前填资料),亲临分行直接开,不过要做好排队的心理准备。

第二类:比较好开的
这类银行服务比较好,中资外资都有,可以选择没有最低结余的户口开立。不过可能是由于不太缺客户,所以多半要求买理财或保险产品,不过不要求立即买。套路也是一样,先预约,直接去开就行了,然后和理财经理聊天,开立户口。

代表银行:中银香港(自在/智盈理财)★★★★★【五星理由:本地网银转账免费、中港两地同名转账手续费全免】、工银亚洲★★★★(综合账户/e时代)、恒生银行★★★(优进理财)、南洋商业银行★★★(自在/智盈理财)等。

开户姿势:先预约,亲临分行和理财经理沟通后,直接开。

第三类:不算难开,但需要聊天比较久的
这类银行规模很大,往往具有全球布局,服务比较好,可以选择没有最低结余的户口开立。不算难开,不过可能是由于完全不缺客户,所以多半要求买理财或保险产品,通常聊天比较久的,并且他们要感觉在你身上能发现利润的点,这类银行你需要准备一个上午或下午的时间过去,往往会对你进行尽职调查和理财分析,不过不要求立即买。套路也是一样,先预约,直接去开就行了,然后和理财经理深入聊天,让他感觉你能带来利润,随之开立户口。

代表银行:汇丰银行(One综合户口)★★★★★【五星理由:本地网银转账免费、海外电汇、本地外币CHATS转入均不收落地费、网银功能丰富强大、全球汇款7*24汇款免费秒到(卓越用户)、投资户口开立、内地用户网银申请信用卡可秒批并直邮国内……】、渣打银行(快易/premium理财)★★★★★等【五星理由:本地网银转账免费、全球取现免费(premium理财)】。

开户姿势:先预约,亲临分行和理财经理沟通后,直接开。

第四类:比较难开
这类银行服务比较好,可以选择没有最低结余的户口开立。不过这类银行估计是不太喜欢内地游客客户,所以会对你进行比较详细的尽职调查和理财分析。聊天时间会更久,同样他们要感觉在你身上能发现利润的点,这类银行你同样需要准备一个上午或下午的时间过去,有可能叫你立即买,否则就不开户。不过这类银行在程序上也不是铁板一块,完全有商量的余地,例如以后再存款,以后再购买。套路也是一样,先预约,直接去开就行了,然后和理财经理深入聊天,让他感觉你能带来利润,随之开立户口,口才不好的可能需要做好被拒绝的心理准备。

代表银行:东亚银行★★★★★(i-account户口)【五星理由:中港两地转账转他人实时到账,落地费仅65HKD或免费(至尊或卓显理财)】、大新银行★★★(i-account户口)、永亨银行★★★(综合理财户口)等。

开户姿势:先预约,亲临分行和理财经理沟通后,直接开。

第五类:非常难开
这类银行要么就是服务非常好、门槛非常高,要么就是银行里有不成文的政策一般不给内地游客开户。当然,规章制度既然没有明文写一定不能开,那就是仍有开立的可能,值得各位飞友发挥和探索。去这类银行开户,首先应仔细学习银行香港开户政策,然后借鉴已成功开户朋友的经验,结合自己的情况,制定个性化的方案,各个击破,达到成功开立户口的目的。

代表银行:花旗银行★★★★★(原则上对内地用户仅开立citigold户口)——原则上开户需准备不低于150万港币一次性存入,并购买产品;【优势:母公司在美国,美国业务优势,大量费用减免】星展银行★★★★★(原则上对内地用户仅开立丰盛理财户口)——原则上开户需准备不低于100万港币一次性存入,并购买产品;【优势:如涉及与敏感的国家、敏感行业往来的合规交易,(敏感国家:马来西亚,泰国,菲律宾,俄罗斯,迪拜,朝鲜,中东国家,印度哥伦比亚),星展银行有一定的处理经验。】交银香港★★★★(中资)——原则上不允许内地人开户;【优势:各项费用较低。】上海商业银行★★★★(两岸三地)——原则上不允许内地人开户;【优势:两岸三地业务优势,协助开立台湾户口。】富邦香港★★★★(台资)——原则上不允许内地人开户。【优势:台湾本土业务优势,协助开立台湾户口。】等

Username is not in the sudoers file. This incident will be reported

最近在研究openwrt的编译.

因为openwrt的编译不能使用root用户,所以必须得自己添加一个用户:

adduser openwrt

然后在openwrt用户下使用sudo:

sudo apt update

会报这个错误:

openwrt is not in the sudoers file. This incident will be reported

这是因为openwrt 不在管理组,没有sudo的权限.

解决的办法也很简单,在root用户下把openwrt加入sudo组即可

usermod -aG sudo openwrt 
# a stands for append, G stands for Group, usually use aG together

再或者使用visudo命令,这个命令其实就是编辑/etc/sudoers

往下拉,看到这一行

#User privilege specification

root ALL=(ALL:ALL) ALL

在root的下面添加上自己的用户名:

#User privilege specification

root ALL=(ALL:ALL) ALL

username ALL=(ALL:ALL) ALL

保存退出即可

 

Oracle 云主机默认镜像ubuntu 18.04的坑

开了一台甲骨文的San Jose 数据中心的Cloud VM,默认支持的系统中没有debian,因此退而求其次选择了ubuntu 18.04 minimum.

按照习惯,把SSH端口从22改成了一个其他的端口,但是确发现SSH始终都连不上了.  检查了这个VM的security list,所有的端口都打开了,没有问题,看来问题只能出在ubuntu的默认防火墙上了.

默认的ubuntu 18.04的防火墙是iptables, 默认没有安装ufw,而且oracle 官方也不推荐使用ufw(这是后来才知道的)

可是按照ubuntu/debian的默认安装,防火墙iptables虽然是默认开启的,但是里面没有任何的规则. google了半天才发现原来是Oracle给他的默认的linux 的OS 都写入了默认的规则,路径在/etc/iptables/rules.v4 和rules.v6.

把rules.v4的规则里的两条reject 规则给他comment out,就可以了.

#-A INPUT -j REJECT --reject-with icmp-host-prohibited
#-A FORWARD -j REJECT --reject-with icmp-host-prohibited

 

Discuz开发 discuz 论坛注册,登录流程整理

discuz 论坛 用户注册流程
第一步:
/source/class/class_member.php: on_register注册入口
L602 左右
if(!$activation) {//不为空,说明用户已经注册过
//将用户注册到用户中心,调用第二步uc_user_register方法
$uid = uc_user_register(addslashes($username), $password, $email, $questionid, $answer, $_G[‘clientip’]);

第二步:
/uc_client/client.php: uc_user_register 调用将用户注册到用户中心的方法,调用第三步的onregister方法
第三步:
/uc_client/control/user.php: onregister 将用户注册到用中心,调用第四步add_user方法
第四步:
/uc_client/model/user.php:add_user 将用户注册到ucenter返回用户id
第五步:
/source/class/class_member.php:
L685行 左右,会把用户信息写到common_member表。注册结束
C::t(‘common_member’)->insert($uid, $username, $password, $email, $_G[‘clientip’], $groupinfo[‘groupid’], $init_arr);

discuz 论坛 登陆流程
第一步:
/source/class/class_member.php: on_login 登陆入口
87行左右,调用userlogin方法如下:
$result = userlogin($_GET[‘username’], $_GET[‘password’], $_GET[‘questionid’], $_GET[‘answer’], $this->setting[‘autoidselect’] ? ‘auto’ : $_GET[‘loginfield’], $_G[‘clientip’]);
第二步:
/source/function/function_member.php: logincheck
72行左右 调用 logincheck,如下:
if(!($_G[‘member_loginperm’] = logincheck($_GET[‘username’]))) {
showmessage(‘login_strike’);
}
第三步:
/source/function/function_member.php: userlogin 用户登陆查询相关表
第29行-40行左右会用调用uc_user_login方法
if($isuid == 3) {
if(!strcmp(dintval($username), $username) && getglobal(‘setting/uidlogin’)) {
$return[‘ucresult’] = uc_user_login($username, $password, 1, 1, $questionid, $answer, $ip);// uc_client/client.php
} elseif(isemail($username)) {
$return[‘ucresult’] = uc_user_login($username, $password, 2, 1, $questionid, $answer, $ip);// uc_client/client.php
}
if($return[‘ucresult’][0] <= 0 && $return[‘ucresult’][0] != -3) {
$return[‘ucresult’] = uc_user_login(addslashes($username), $password, 0, 1, $questionid, $answer, $ip);
}
} else {
$return[‘ucresult’] = uc_user_login(addslashes($username), $password, $isuid, 1, $questionid, $answer, $ip);
}

/uc_client/client.php: 包含uc_开头的全部方法,例uc_user_login
/uc_client/control/user.php: onlogin 根据条件判断登陆,114-120 判断查询条件查询出ucenter用户信息
/uc_client/model/user.php 包含有get_user_by_uid,get_user_by_username 等方法 第50行左右查询common_member表,如下:
$member = getuserbyuid($return[‘ucresult’][‘uid’], 1);

回到/source/class/class_member.php文件on_login方法

第95-106 行左右会根据条件$result[‘status’]==-1 ,写common_member表,并查询出写入信息
C::t(‘common_member’)->insert($uid, $result[‘ucresult’][‘username’], md5(random(10)), $result[‘ucresult’][’email’], $_G[‘clientip’], $groupid, $init_arr);
$result[‘member’] = getuserbyuid($uid);

————————————————————————————-
ps:以上所有方法都会先执行
/source/class/discuz/discuz_application.php: _init_user
所以如果要自己写checklogin 可以考虑从_init_user 方法入手

如果与自己的平台做bbs的打通。
注册可以考虑在第4步做操作,调用自己平台的注册接口。注册用户,并将用户id返回。写入到ucenter
/uc_client/model/user.php:add_user 方法内

登陆打通可以考虑在 第三步调用 uc_user_login 方法前,
1.调用自己平台接口查询用户相关信息
2.查询ucenter中用户是否存在
3.如果不存在insert一条数据
4.common_member可以写也可以不写 ,如此时不写 $result[‘status’]==-1 会在class_member 95-106 行左右写入

如果在自己平台处于登陆状态,在discuz 也为登陆状态,则可以考虑从_init_user 方法入手。做登录判断

Discuz 3.2, 3.3, 3.4 直接利用SQL创建新用户

我们的网站要和Discuz整合到一起,有个新用户同步的需求,网络上很多的做法是用 UCenter的接口来做,反正最后都是插入SQL,笔者使用了直接操作数据库的方式,把操作的表和SQL整理了下,后面如果有时间做个SSO就省事了

版本:dz 3.2版本 ucenter1.6版本
目标:插入普通用户,最小可用就行了,可以登录

SQL记录:

注意:表名称前缀根据配置可能不同, 一共有8张表

SELECT *FROM pre_ucenter_members;
-- UCenter用户数据表 uid, username, password, email, regip(默认写一个值), regdate(时间戳), salt(随机6位字母数字)

SELECT *FROM pre_ucenter_memberfields;
-- UCenter用户扩展信息数据表 插入 uid

SELECT *FROM pre_common_member;
-- 主用户表 插入的字段 email, username, password, emailstatus, regdate(时间戳)
-- 得到uid再插入其它表

SELECT *FROM pre_common_member_count;
-- 用户数据统计 各种积分,动态等 插入 uid

SELECT *FROM pre_common_member_field_forum;
-- 用户论坛设置数据表 插入 uid

SELECT *FROM pre_common_member_field_home;
-- 用户家园设置数据表 插入 uid

SELECT *FROM pre_common_member_profile;
-- 用户个人资料数据表 插入 uid

SELECT *FROM pre_common_member_status;
-- 用户状态数据表 插入 uid


-- 下面是插入一个普通用户的测试, 这里根据id自增,自己算出了uid,便于sql书写 
-- lzz, 邮箱 [email protected], 密码 xyz2541 
-- 需要计算的密码 pre_common_member 密码为 md5(password) 2cf5c897f58ca21cac9bec93f46f6f53
-- pre_ucenter_members salt yyy111 密码为 md5(md5(password)+salt) 4fab791987738fce5f11504a0fe2a342
-- MYSQL mode 设置的比较严格,所以很多默认值要自己加上。。

INSERT INTO pre_ucenter_members SET uid=7, username='lzz', `password`='4fab791987738fce5f11504a0fe2a342', email='[email protected]', regip='127.0.0.1', regdate=UNIX_TIMESTAMP(), salt='yyy111';

INSERT INTO pre_ucenter_memberfields SET uid=7, blacklist='';

INSERT INTO pre_common_member SET uid=7, username='lzz', `password`='2cf5c897f58ca21cac9bec93f46f6f53', email='[email protected]', emailstatus=1, regdate=UNIX_TIMESTAMP();

INSERT INTO pre_common_member_count SET uid=7;

INSERT INTO pre_common_member_field_forum SET uid=7, `medals`='', `sightml`='', `groupterms`='', `groups`='';

INSERT INTO pre_common_member_field_home SET uid=7, `spacecss`='', `blockposition`='', 
`recentnote`='', `spacenote`='', `privacy`='', `feedfriend`='', `acceptemail`='', `magicgift`='', `stickblogs`='';

INSERT INTO pre_common_member_profile SET uid=7, `bio`='', `interest`='', `field1`='', `field2`='',
`field3`='', `field4`='', `field5`='', `field6`='', `field7`='', `field8`='';

INSERT INTO pre_common_member_status SET uid=7;

在Discuz的数据库中插入到数据库之后,web端就能登录了

Ucenter中的用户批量导入到discuz中的办法

这个代码是搜索到的,主要看一下需要在数据库里更新哪些表格.

将下面的代码复制到一个php中,并在浏览器中输入地址执行:

<?php
$dbserver =’localhost’; //此处改成数据库服务器地址
$dbuser =’root’;//此处写数据库用户名
$dbpwd =’1234′;//数据库密码
$dbname =’disucz’;//数据库名称
$charset =’gbk’;//此处写字符集gbk或者utf8
$uc_pre =’pre_ucenter_’;//UC表前缀
$dx_pre =’pre_’;//Discuz! X2表前缀
//此行开始向下不要改动
set_time_limit(0); //0为无限制
$connect=mysql_connect($dbserver,$dbuser,$dbpwd) or die(“无法连接数据库”);
@mysql_select_db($dbname,$connect);
mysql_query(“set names $charset”);
$query = mysql_query(“SELECT * FROM `{$uc_pre}members` WHERE `uid` not in(select `uid` from `{$dx_pre}common_member`) “,$connect);
while($user = mysql_fetch_array($query)) {
$password=$user[password];
mysql_query(” replace INTO `{$dx_pre}common_member` (uid,username,password,adminid,groupid,regdate,email) VALUES (‘$user[uid]’, ‘$user[username]’, ‘$password’,’0′,’10’,’$user[regdate]’,’$user[email]’) “);
mysql_query(” replace INTO `{$dx_pre}common_member_field_forum` (uid) VALUES (‘$user[uid]’)”);
mysql_query(” replace INTO `{$dx_pre}common_member_field_home` (uid) VALUES (‘$user[uid]’)”);
mysql_query(” replace INTO `{$dx_pre}common_member_count` (uid) VALUES (‘$user[uid]’)”);
mysql_query(” replace INTO `{$dx_pre}common_member_profile` (uid) VALUES (‘$user[uid]’)”);
mysql_query(” replace INTO `{$dx_pre}common_member_status` (uid) VALUES (‘$user[uid]’)”);
}
echo “已从UC批量导入激活成功”;
?>

注释: 连接到数据库后,PHP会比对UC和DZ用户表的数据,发现不存在于DZ但是存在于UC的用户,就会把用户导入到DZ,但是这一注册不会设置其他内容,比如用户填写的详细信息,由于以前是存储在DZ数据库中,所以还是丢失了

这样子用户已经全部导入,用户数也恢复了正常

下一步,将用户的邮箱验证全部设置为已验证

数据库执行:

update pre_common_menber set emailstatus="1";

注释:这是更新数据库中emailstatus字段,1为验证 pre记得改为你的论坛的前缀

 

 

Scaleway (online.net) 服务器在ESXi里面SSD驱动选择问题

目前我的网站架构里面大量使用了scaleway(online.net)的Pro-4-L的服务器. 这种服务器使用的SSD,主要有两个牌子,一个三星的evo850 SSD,一个是美光的M1000 SSD

在安装了ESXi的情况下, evo 850 可以使用ESXi 默认的驱动 vmw-ahci就可以保证满速,但是美光的M1000系列就需要回退到ahci驱动,才能保证满速.