top-image

OLDER ARTICLES

为了提高使用PbootCMS构建的网站的安全性,防止网站被黑客攻击、篡改内容等问题,可以采取一系列的安全措施。下面是一些推荐的安全设置步骤:

1. 更新系统和插件

  • 定期更新:确保PbootCMS及其插件始终保持最新版本,以获得最新的安全修复和功能改进。

2. 强化密码策略

  • 强密码:确保管理员账户和其他重要账户使用强密码,包含大小写字母、数字和特殊字符。
  • 定期更换:定期更换密码,尤其是管理员密码。

3. 限制后台访问

  • IP限制:只允许特定IP地址访问后台管理界面。
  • 登录尝试限制:启用登录尝试失败次数限制,防止暴力破解。

4. 文件和目录权限

  • 权限设置:确保除了缓存目录和图片上传目录之外的所有目录和文件都设置为不可写入。例如,可以将权限设置为755对于目录和644对于文件。
  • 重命名敏感目录:考虑重命名data目录或其他敏感目录,减少被攻击的风险。

5. 使用安全插件或服务

  • WAF:使用Web应用防火墙(WAF)保护网站免受常见类型的攻击。
  • CDN服务:使用如百度云防护或京东云星盾这样的安全CDN服务,不仅可以加速网站,还可以提供DDoS防护和Web攻击防护。

6. 数据库安全

  • 定期备份:定期备份数据库,以便在遭受攻击后能够快速恢复。
  • SQL注入防护:确保所有数据库查询都经过适当的过滤和转义,防止SQL注入攻击。

7. 代码审查

  • 代码审计:定期对网站代码进行安全审计,查找可能的安全漏洞。
  • 禁用危险函数:在PHP配置中禁用可能导致安全问题的函数,如eval()exec()等。

8. 服务器安全

  • 操作系统更新:确保服务器操作系统和软件包保持最新状态。
  • 安全补丁:安装所有必要的安全补丁。

9. 日志监控

  • 启用日志记录:启用并配置日志记录,以便跟踪任何可疑活动。
  • 日志分析:定期分析日志文件,寻找异常行为。

10. 敏感信息保护

  • 加密存储:对于存储在数据库中的敏感信息,如密码,使用强哈希算法加密存储。
  • 最小权限原则:确保每个用户和进程仅具有完成其任务所需的最小权限。

问题:pbootcms后台可以打开前台打不开

原因:大概率是没有授权, 去申请授权添加后台就可以

<?php
/**
 * @copyright (C)2016-2099 Hnaoyun Inc.
 * @license This is not a freeware, use is subject to license terms
 * @author XingMeng
 * @email hnxsh@foxmail.com
 * @date 2018年11月17日
 *  重置PbootCMS用户密码
 */
// 设置字符集编码、IE文档模式
header('Content-Type:text/html; charset=utf-8');
header('X-UA-Compatible:IE=edge,chrome=1');

// 设置中国时区
date_default_timezone_set('Asia/Shanghai');

// 引入配置文件
$db = require __DIR__.'/config/database.php';


//执行修改	
if ($_POST) {
    
    // 数据库配置文件
    $db_path = __DIR__ . @$_POST['config'];
	
	//纠正路径
	$db = require $db_path;
    
    // 检查配置文件是否存在
    if (! file_exists($db_path)) {
        die('数据库配置文件不存在,请检查路径是否填写正常!');
    }
    
    // 要重置的用户名
    $username = @$_POST['username'];
    
    // 要设置的密码
    $password = @$_POST['password'];
    
    if (! $username) {
        exit('需要重置密码的用户名不能为空!');
    }
    
    if (! $password) {
        exit('请输入需要设置的新密码!');
    }
    
    // 修改密码
    $sql = "UPDATE ay_user SET password='" . md5(md5($password)) . "' where username='$username'";
    if ($db['database']['type'] == 'sqlite' || $db['database']['type'] == 'pdo_sqlite') {
        $conn = get_sqlite(__DIR__ . $db['database']['dbname']);
        $result = $conn->exec($sql) or $conn->lastErrorMsg();
        if ($conn->changes()) {
            echo '恭喜您,重置成功!';
        } else {
            echo '不好意思,重置失败,请核对用户名!(sqlite)';
        }
    } else {
        $conn = get_mysql($db['database']);
        $result = $conn->query($sql) or mysqli_error($conn);
        if ($conn->affected_rows > 0) {
            echo '恭喜您,重置成功!';
        } else {
            echo '不好意思,重置失败,请核对用户名!(mysql)';
        }
    }
}

// 连接数据库,接受数据库连接参数,返回数据库连接对象
function get_sqlite($dbfile)
{
    if (extension_loaded('SQLite3')) {
        try {
            $conn = new SQLite3($dbfile);
            $conn->busyTimeout(15 * 1000); // 设置繁忙延迟时间
        } catch (Exception $e) {
            die("读取数据库文件失败:" . iconv('gbk', 'utf-8', $e->getMessage()));
        }
    } else {
        error('未检测到您服务器环境的SQLite3数据库扩展,请检查php.ini中是否已经开启该扩展!');
    }
    return $conn;
}

// 连接数据库,接受数据库连接参数,返回数据库连接对象
function get_mysql($cfg)
{
    if (! extension_loaded('mysqli')) {
        die('未检测到您服务器环境的mysqli数据库扩展,请检查php.ini中是否已经开启该扩展!');
    }
    // 优化>php5.3版本 在win2008以上服务器连接
    if ($cfg['host'] == 'localhost') {
        $cfg['host'] = '127.0.0.1';
    }
    
    $conn = @new Mysqli($cfg['host'], $cfg['user'], $cfg['passwd'], $cfg['dbname'], $cfg['dbport']);
    if (mysqli_connect_errno()) {
        die("连接数据库服务器失败:" . iconv('gbk', 'utf-8', mysqli_connect_error()));
    }
    $conn->set_charset('utf8'); // 设置编码
    return $conn;
}

// 获取用户名
$sql = 'select username from ay_user';
if ($db['database']['type'] == 'sqlite' || $db['database']['type'] == 'pdo_sqlite') {
	$conn = get_sqlite(__DIR__ . $db['database']['dbname']);
	$result = $conn->query($sql) or $conn->lastErrorMsg();
	$rows = array();
	while (! ! $row = $result->fetchArray(1)) {
		if ($row) {
			$out = new stdClass();
			foreach ($row as $key => $value) {
				$out->$key = $value;
			}
			$row = $out;
		}
		$rows[] = $row;
	}
} else {
	$conn = get_mysql($db['database']);
	$result = $conn->query($sql) or mysqli_error($conn);
	$rows = array();
	if ($conn->affected_rows > 0) {
		 while (! ! $objects = $result->fetch_object()) {
			$rows[] = $objects;
		}
	} 
}
?>

<!doctype html>
<html lang="zh">
<head>
	<meta charset="utf-8">
	<title>PbootCMS-密码重置工具</title>
</head>
<body>

<form class="mb-5" action=""  method="post">
 <p>配置文件:<input type="text" name="config" value="/config/database.php"  placeholder="请填写数据库配置文件路径"></p>
 <p>用 户 名 :
 <select name="username">
 <?php
	foreach($rows as $k=>$v){
		echo "<option value='".$v->username."'>".$v->username."</option>";
	}
 ?>
 </select>
 </p>
 <p>新 密 码 :<input type="text" name="password" placeholder="请输入新密码"> </p>
 <p><button type="submit" class="btn btn-info mb-2">提交</button></p>
</form>

</body>
</html>

 

登录请求发生错误,您可按照如下方式排查:

1、试着删除根目录下runtime目录,刷新页面重试;

2、检查系统会话文件存储目录是否具有写入权限;

3、检查服务器环境pathinfo及伪静态规则配置;

打开PBootCMS程序下的core/extend/ueditor/php/controller.php文件,

将第四行的注释去掉,并且将 chongqing 修改为首字母大写 Chongqing

修改结果如下:

最近一段时间,有不少用户前来询问,究竟怎样才能够修改 PbootCMS 默认的后台登录网址呢?
 
要知道,PbootCMS 默认的后台网址是/admin.php,而有些用户,也就是众多粉丝们,希望能够将这个 admin.php 修改成符合自己喜好的链接。
 
下面就为大家提供一份修改教程:首先,进入网站程序所在的根目录。在这个根目录中,找到名为 admin.php 的文件。接着,把这个文件的名称修改为自己喜欢的英文(或者数字)就可以了。举个例子,比如把 admin.php 改为 woshihoutai.php。需要注意的是,文件里面的代码无需进行修改,同时也不用去修改其他任何文件,这样就能够通过访问新的后台域名来进入管理后台了。

此工具用于忘记PbootCMS后台用户账号密码时进行重置。新建一个php文件,然后写入下面代码。稍后上传网站根目录,  访问文件就可以进入重置页面, 后续根据提示操作即可。 

<?php
/**
 * @copyright (C)2016-2099 Hnaoyun Inc.
 * @author XingMeng
 * @email hnxsh@foxmail.com
 * @date 2017年3月13日
 *  默认主页
 */
namespace app\admin\controller;

use core\basic\Controller;
use app\admin\model\IndexModel;

class IndexController extends Controller
{

    private $model;

    public function __construct()
    {
        $this->model = new IndexModel();
    }

    // 登录页面
    public function index()
    {
        if (session('sid')) {
            location(url('admin/Index/home'));
        }
        $this->assign('admin_check_code', $this->config('admin_check_code'));
        $this->display('index.html');
    }

    // 主页面
    public function home()
    {
        // 手动修改数据名称
        if (get('action') == 'moddb') {
            if ($this->modDB()) {
                alert_back('修改成功!');
            } else {
                alert_back('修改失败!');
            }
        }

        // 删除修改后老数据库(上一步无法直接修改删除)
        if (issetSession('deldb')) {
            @unlink(ROOT_PATH . session('deldb'));
            unset($_SESSION['deldb']);
        }

        $dbsecurity = true;
        // 如果是sqlite数据库,并且路径为默认的,则标记为不安全
        if (get_db_type() == 'sqlite') {
            // 数据库配置含有默认名字则进行修改
            if (strpos($this->config('database.dbname'), 'pbootcms') !== false) {
                if (get_user_ip() != '127.0.0.1' && $this->modDB()) { // 非本地测试时尝试自动修改数据库名称
                    $dbsecurity = true;
                } else {
                    $dbsecurity = false;
                }
            } elseif (file_exists(ROOT_PATH . '/data/pbootcms.db')) { // 存在多余的默认数据库文件则改名
                rename(ROOT_PATH . '/data/pbootcms.db', ROOT_PATH . '/data/' . get_uniqid() . '.db');
            }
        } elseif (file_exists(ROOT_PATH . '/data/pbootcms.db')) {
            rename(ROOT_PATH . '/data/pbootcms.db', ROOT_PATH . '/data/' . get_uniqid() . '.db');
        }

        $this->assign('dbsecurity', $dbsecurity);

        if (!session('pwsecurity')) {
            location(url('/admin/Index/ucenter'));
        }

        $this->assign('server', get_server_info());
        $this->assign('branch', $this->config('upgrade_branch') == '3.X.dev' ? '3.X.dev' : '3.X');
        $this->assign('revise', $this->config('revise_version') ?: '0');
        $this->assign('snuser', $this->config('sn_user') ?: '0');
        $this->assign('site', get_http_url());

        $this->assign('user_info', $this->model->getUserInfo(session('ucode')));

        $this->assign('sum_msg', model('admin.content.Message')->getCount());

        // 内容模型菜单
        $model = model('admin.content.Model');
        $models = $model->getModelMenu();
        foreach ($models as $key => $value) {
            $models[$key]->count = $model->getModelCount($value->mcode)->count;
        }

        $this->assign('model_msg', $models);
        $this->display('system/home.html');
    }

    // 异步登录验证
    public function login()
    {
        if (!$_POST) {
            return;
        }

        // 在安装了gd库时才执行验证码验证
        if (extension_loaded("gd") && $this->config('admin_check_code') && strtolower(post('checkcode', 'var')) != session('checkcode')) {
            json(0, '验证码错误!');
        }

        // 就收数据
        $username = post('username');
        $password = post('password');
        $checkcode = post('checkcode');
        $formcheck = post('formcheck');

        if (!preg_match('/^[\x{4e00}-\x{9fa5}\w\-\.@]+$/u', $username)) {
            json(0, '用户名含有不允许的特殊字符!');
        }

        if (!$username) {
            json(0, '用户名不能为空!');
        }

        if (!$password) {
            json(0, '密码不能为空!');
        }



        if (!$formcheck) {
            json(0, '表单提交校验失败,请刷新后重试!');
        }

        if (!!$time = $this->checkLoginBlack()) {
            $this->log('登录锁定!');
            json(0, '您登录失败次数太多已被锁定,请' . $time . '秒后再试!');
        }

        // 执行用户登录
        $where = array(
            'username' => $username,
            'password' => encrypt_string($password)
        );

        // 判断数据库写入权限
        if ((get_db_type() == 'sqlite') && !is_writable(ROOT_PATH . $this->config('database.dbname'))) {
            json(0, '数据库目录写入权限不足!');
        }

        if (!!$login = $this->model->login($where)) {

            session_regenerate_id(true);
            session('sid', encrypt_string(session_id() . $login->id)); // 会话标识
            session('M', M);

            session('id', $login->id); // 用户id
            session('ucode', $login->ucode); // 用户编码
            session('username', $login->username); // 用户名
            session('realname', $login->realname); // 真实名字

            if ($where['password'] != '14e1b600b1fd579f47433b88e8d85291') {
                session('pwsecurity', true);
            }

            session('acodes', $login->acodes); // 用户管理区域
            if ($login->acodes) { // 当前显示区域
                session('acode', $login->acodes[0]);
            } else {
                session('acode', '');
            }

            session('rcodes', $login->rcodes); // 用户角色代码表
            session('levels', $login->levels); // 用户权限URL列表
            session('menu_tree', $login->menus); // 菜单树
            session('area_map', $login->area_map); // 区域代码名称映射表
            session('area_tree', $login->area_tree); // 用户区域树

            $this->log('登录成功!');
            json(1, url('admin/Index/home'));
        } else {
            $this->setLoginBlack();
            $this->log('登录失败!');
            session('checkcode', mt_rand(10000, 99999)); // 登录失败,随机打乱原有验证码
            json(0, '用户名或密码错误!');
        }
    }

    // 退出登录
    public function loginOut()
    {
        session_unset();
        location(url('/admin/Index/index'));
    }

    // 用户中心,修改密码
    public function ucenter()
    {
        if ($_POST) {
            $username = post('username'); // 用户名
            $realname = post('realname'); // 真实姓名
            $cpassword = post('cpassword'); // 现在密码
            $password = post('password'); // 新密码
            $rpassword = post('rpassword'); // 确认密码

            if (!$username) {
                alert_back('用户名不能为空!');
            }
            if (!$cpassword) {
                alert_back('当前密码不能为空!');
            }

            if (!preg_match('/^[\x{4e00}-\x{9fa5}\w\-\.@]+$/u', $username)) {
                alert_back('用户名含有不允许的特殊字符!');
            }

            $data = array(
                'username' => $username,
                'realname' => $realname,
                'update_user' => $username
            );

            // 如果有修改密码,则添加数据
            if ($password) {
                if ($password != $rpassword) {
                    alert_back('确认密码不正确!');
                }
                $data['password'] = encrypt_string($password);
                if ($data['password'] != '14e1b600b1fd579f47433b88e8d85291') {
                    session('pwsecurity', true);
                } else {
                    session('pwsecurity', false);
                }
            }

            // 检查现有密码
            if ($this->model->checkUserPwd(encrypt_string($cpassword))) {
                if ($this->model->modUserInfo($data)) {
                    session('username', post('username'));
                    session('realname', post('realname'));
                    $this->log('用户资料成功!');
                    success('用户资料修改成功!', -1);
                }
            } else {
                $this->log('用户资料修改时当前密码错误!');
                alert_location('当前密码错误!', -1);
            }
        }
        $this->display('system/ucenter.html');
    }

    // 切换显示的数据区域
    public function area()
    {
        if ($_POST) {
            $acode = post('acode');
            if (in_array($acode, session('acodes'))) {
                session('acode', $acode);
                cookie('lg', $acode); // 同步切换前台语言
            }
            location(url('admin/Index/home'));
        }
    }

    // 清理缓存
    public function clearCache()
    {
        if (get('delall')) {
            $rs = path_delete(RUN_PATH);
        } else {
            $rs = (path_delete(RUN_PATH . '/cache') && path_delete(RUN_PATH . '/complile') && path_delete(RUN_PATH . '/config') && path_delete(RUN_PATH . '/upgrade'));
        }
        cache_config(); // 清理缓存后立即生成新的配置
        if ($rs) {
            if (extension_loaded('Zend OPcache')) {
                opcache_reset(); // 在启用了OPcache加速器时同时清理
            }
            $this->log('清理缓存成功!');
            alert_back('清理缓存成功!', 1);
        } else {
            $this->log('清理缓存失败!');
            alert_back('清理缓存失败!', 0);
        }
    }
	
	// 清理系统缓存
    public function clearOnlySysCache()
    {
        if (get('delall')) {
            $rs = path_delete(RUN_PATH);
        } else {
            $rs = (path_delete(RUN_PATH . '/complile') && path_delete(RUN_PATH . '/config') && path_delete(RUN_PATH . '/upgrade'));
        }
        cache_config(); // 清理缓存后立即生成新的配置
        if ($rs) {
            if (extension_loaded('Zend OPcache')) {
                opcache_reset(); // 在启用了OPcache加速器时同时清理
            }
            $this->log('清理缓存成功!');
            alert_back('清理缓存成功!', 1);
        } else {
            $this->log('清理缓存失败!');
            alert_back('清理缓存失败!', 0);
        }
    }
	
    // 清理会话
    public function clearSession()
    {
        ignore_user_abort(true); // 后台运行
        set_time_limit(7200);
        ob_start();
        $output['code'] = 1;
        $output['data'] = '执行成功,后台自动清理中!';
        $output['tourl'] = '';
        echo json_encode($output);
        ob_end_flush();
        flush();
        $rs = path_delete(RUN_PATH . '/session', false, array(
            'sess_' . session_id()
        ));
    }

    // 文件上传方法
    public function upload()
    {
        $upload = upload('upload');
        if (is_array($upload)) {
            json(1, $upload);
        } else {
            json(0, $upload);
        }
    }

    // 检查是否在黑名单
    private function checkLoginBlack()
    {
        // 读取黑名单
        $ip_black = RUN_PATH . '/data/' . md5('login_black') . '.php';
        if (file_exists($ip_black)) {
            $data = require $ip_black;
            $user_ip = get_user_ip();
            $lock_time = $this->config('lock_time') ?: 900;
            $lock_count = $this->config('lock_count') ?: 5;
            if (isset($data[$user_ip]) && $data[$user_ip]['count'] >= $lock_count && time() - $data[$user_ip]['time'] < $lock_time) {
                return $lock_time - (time() - $data[$user_ip]['time']); // 返回剩余秒数
            }
        }
        return false;
    }

    // 添加登录黑名单
    private function setLoginBlack()
    {
        // 读取黑名单
        $ip_black = RUN_PATH . '/data/' . md5('login_black') . '.php';
        if (file_exists($ip_black)) {
            $data = require $ip_black;
        } else {
            $data = array();
        }

        // 添加IP
        $user_ip = get_user_ip();
        $lock_time = $this->config('lock_time') ?: 900;
        $lock_count = $this->config('lock_count') ?: 5;
        if (isset($data[$user_ip]) && $data[$user_ip]['count'] < $lock_count && time() - $data[$user_ip]['time'] < $lock_time) {
            $data[$user_ip] = array(
                'time' => time(),
                'count' => $data[get_user_ip()]['count'] + 1
            );
        } else {
            $data[$user_ip] = array(
                'time' => time(),
                'count' => 1
            );
        }

        // 写入黑名单
        check_file($ip_black, true);
        return file_put_contents($ip_black, "<?php\nreturn " . var_export($data, true) . ";");
    }

    // 修改数据库名称
    private function modDB()
    {
        $file = CONF_PATH . '/database.php';
        $sname = $this->config('database.dbname');
        $dname = '/data/' . get_uniqid() . '.db';
        $sconfig = file_get_contents($file);
        $dconfig = str_replace($sname, $dname, $sconfig);
        if (file_put_contents($file, $dconfig)) {
            if (!copy(ROOT_PATH . $sname, ROOT_PATH . $dname)) {
                file_put_contents($file, $sconfig); // 回滚配置
            } else {
                session('deldb', $sname);
                return true;
            }
        }
        return false;
    }
}

 

遇到 Parse error: syntax error, unexpected 'function' (T_FUNCTION) 的错误,通常是因为 PHP 代码中存在语法错误。这种错误通常发生在 PHP 版本不兼容的情况下,或者代码本身有语法问题。

分析错误

错误信息指出在 \core\function\helper.php 文件的第 80 行出现了语法错误。

解决步骤

  1. 检查第 80 行代码

    • 打开 helper.php 文件,定位到第 80 行。
    • 检查该行及附近的代码,找出可能的语法错误。
  2. 检查 PHP 版本

    • 确认当前使用的 PHP 版本。
    • 检查代码是否与当前 PHP 版本兼容。

管理员由于比较特殊,在系统用户管理中并不能修改,那怎么修改admin的密码呢?

其实每个用户登录后在右上角都可以修改自己的密码,如下图:

Page 890 of 1049:« First« 887 888 889 890 891 892 893 »Last »
bottom-img