From 49facb7b7c897422ed7d7c3deedfeccd2129ce69 Mon Sep 17 00:00:00 2001 From: Karson <karsonzhang@163.com> Date: Thu, 31 Oct 2019 23:36:54 +0800 Subject: [PATCH] 新增后台IP变动控制开关 优化后台插件管理显示 优化Fast.api.ajax方法返回 优化管理员日志显示 --- application/admin/command/Crud/stubs/controllerindex.stub | 2 +- application/admin/controller/Index.php | 2 ++ application/admin/library/Auth.php | 13 +++++++++---- application/admin/model/AdminLog.php | 2 +- application/admin/view/addon/index.html | 106 +++++++++++++++++++++++++++++++++++++++++++++++++++++----------------------------------------------------- application/admin/view/auth/adminlog/detail.html | 2 +- application/common/library/Auth.php | 4 +++- application/config.php | 4 +++- public/assets/js/backend/addon.js | 24 +++++++++++------------- public/assets/js/fast.js | 2 +- public/assets/js/require-backend.min.js | 2 +- public/assets/js/require-frontend.min.js | 2 +- 12 files changed, 87 insertions(+), 78 deletions(-) diff --git a/application/admin/command/Crud/stubs/controllerindex.stub b/application/admin/command/Crud/stubs/controllerindex.stub index 2771aa6..74470ca 100755 --- a/application/admin/command/Crud/stubs/controllerindex.stub +++ b/application/admin/command/Crud/stubs/controllerindex.stub @@ -7,7 +7,7 @@ //当前是否为关联查询 $this->relationSearch = {%relationSearch%}; //设置过滤方法 - $this->request->filter(['strip_tags']); + $this->request->filter(['strip_tags', 'trim']); if ($this->request->isAjax()) { //如果发送的来源是Selectpage,则转发到Selectpage diff --git a/application/admin/controller/Index.php b/application/admin/controller/Index.php index 56f2b7e..185200e 100644 --- a/application/admin/controller/Index.php +++ b/application/admin/controller/Index.php @@ -22,6 +22,8 @@ class Index extends Backend public function _initialize() { parent::_initialize(); + //移除HTML标签 + $this->request->filter('trim,strip_tags,htmlspecialchars'); } /** diff --git a/application/admin/library/Auth.php b/application/admin/library/Auth.php index 1054e6e..ed68db8 100644 --- a/application/admin/library/Auth.php +++ b/application/admin/library/Auth.php @@ -59,7 +59,7 @@ class Auth extends \fast\Auth } $admin->loginfailure = 0; $admin->logintime = time(); - $admin->loginip = request()->ip(0, false); + $admin->loginip = request()->ip(); $admin->token = Random::uuid(); $admin->save(); Session::set("admin", $admin->toArray()); @@ -103,7 +103,7 @@ class Auth extends \fast\Auth if ($key != md5(md5($id) . md5($keeptime) . md5($expiretime) . $admin->token)) { return false; } - $ip = request()->ip(0, false); + $ip = request()->ip(); //IP有变动 if ($admin->loginip != $ip) { return false; @@ -183,11 +183,16 @@ class Auth extends \fast\Auth if (Config::get('fastadmin.login_unique')) { $my = Admin::get($admin['id']); if (!$my || $my['token'] != $admin['token']) { + $this->logout(); return false; } } - if (!isset($admin['loginip']) || $admin['loginip'] != request()->ip(0, false)) { - return false; + //判断管理员IP是否变动 + if (Config::get('fastadmin.loginip_check')) { + if (!isset($admin['loginip']) || $admin['loginip'] != request()->ip()) { + $this->logout(); + return false; + } } $this->logined = true; return true; diff --git a/application/admin/model/AdminLog.php b/application/admin/model/AdminLog.php index 5f95112..e0d92af 100644 --- a/application/admin/model/AdminLog.php +++ b/application/admin/model/AdminLog.php @@ -35,7 +35,7 @@ class AdminLog extends Model $username = $auth->isLogin() ? $auth->username : __('Unknown'); $content = self::$content; if (!$content) { - $content = request()->param(); + $content = request()->param('', null, 'trim,strip_tags,htmlspecialchars'); foreach ($content as $k => $v) { if (is_string($v) && strlen($v) > 200 || stripos($k, 'password') !== false) { unset($content[$k]); diff --git a/application/admin/view/addon/index.html b/application/admin/view/addon/index.html index 0d5756b..2c974c1 100644 --- a/application/admin/view/addon/index.html +++ b/application/admin/view/addon/index.html @@ -233,6 +233,7 @@ </tbody> </table> </script> +<!--@formatter:off--> <script id="operatetpl" type="text/html"> <% var labelarr = ['primary', 'success', 'info', 'danger', 'warning']; %> <% var label = labelarr[item.id % 5]; %> @@ -240,63 +241,62 @@ <div class="operate" data-id="<%=item.id%>" data-name="<%=item.name%>"> <% if(!addon){ %> - <% if(typeof item.releaselist !="undefined" && item.releaselist.length>1){%> - <span class="btn-group"> + <% if(typeof item.releaselist !="undefined" && item.releaselist.length>1){%> + <span class="btn-group"> + <a href="javascript:;" class="btn btn-xs btn-primary btn-success btn-install" + data-type="<%=item.price<=0?'free':'price';%>" data-donateimage="<%=item.donateimage%>" + data-version="<%=item.version%>"><i class="fa fa-cloud-download"></i> {:__('Install')}</a> + <a class="btn btn-xs btn-success dropdown-toggle" data-toggle="dropdown" href="javascript:;"> + <span class="fa fa-caret-down"></span> + </a> + <ul class="dropdown-menu"> + <% for(var j=0;j< item.releaselist.length;j++){ %> + <li><a href="javascript:;" class="btn-install" data-type="<%=item.price<=0?'free':'price';%>" + data-donateimage="<%=item.donateimage%>" + data-version="<%=item.releaselist[j].version%>"><%=item.releaselist[j].version%></a></li> + <% } %> + </ul> + </span> + <% }else{%> <a href="javascript:;" class="btn btn-xs btn-primary btn-success btn-install" data-type="<%=item.price<=0?'free':'price';%>" data-donateimage="<%=item.donateimage%>" data-version="<%=item.version%>"><i class="fa fa-cloud-download"></i> {:__('Install')}</a> - <a class="btn btn-xs btn-success dropdown-toggle" data-toggle="dropdown" href="javascript:;"> - <span class="fa fa-caret-down"></span> - </a> - <ul class="dropdown-menu"> - <% for(var j=0;j< item.releaselist.length;j++){ %> - <li><a href="javascript:;" class="btn-install" data-type="<%=item.price<=0?'free':'price';%>" - data-donateimage="<%=item.donateimage%>" - data-version="<%=item.releaselist[j].version%>"><%=item.releaselist[j].version%></a></li> - <% } %> - </ul> - </span> - <% }else{%> - <a href="javascript:;" class="btn btn-xs btn-primary btn-success btn-install" - data-type="<%=item.price<=0?'free':'price';%>" data-donateimage="<%=item.donateimage%>" - data-version="<%=item.version%>"><i class="fa fa-cloud-download"></i> {:__('Install')}</a> - <% } %> + <% } %> - <% if(item.demourl){ %> - <a href="<%=item.demourl%>" class="btn btn-xs btn-primary btn-info btn-demo" target="_blank"> - <i class="fa fa-flash"></i> {:__('Demo')} - </a> - <% } %> + <% if(item.demourl){ %> + <a href="<%=item.demourl%>" class="btn btn-xs btn-primary btn-info btn-demo" target="_blank"> + <i class="fa fa-flash"></i> {:__('Demo')} + </a> + <% } %> <% } else {%> - <% if(addon.version!=item.version){%> - <% if(typeof item.releaselist !="undefined" && item.releaselist.length>1){%> - <span class="btn-group"> - <a href="javascript:;" class="btn btn-xs btn-info btn-success btn-upgrade" - data-version="<%=item.version%>"><i class="fa fa-cloud"></i> {:__('Upgrade')}</a> - <a class="btn btn-xs btn-info dropdown-toggle" data-toggle="dropdown" - href="javascript:;"> - <span class="fa fa-caret-down"></span> - </a> - <ul class="dropdown-menu"> - <% for(var j=0;j< item.releaselist.length;j++){ %> - <li><a href="javascript:;" class="btn-upgrade" - data-version="<%=item.releaselist[j].version%>"><%=item.releaselist[j].version%></a></li> - <% } %> - </ul> - </span> - <% }else{%> - <a href="javascript:;" class="btn btn-xs btn-info btn-upgrade" title="{:__('Upgrade')}" data-version="<%=item.version%>"><i - class="fa fa-cloud"></i> {:__('Upgrade')}</a> - <% }%> - <% }%> - <% if(addon.config){ %> - <a href="javascript:;" class="btn btn-xs btn-primary btn-config" title="{:__('Setting')}"><i class="fa fa-pencil"></i> - {:__('Setting')}</a> + <% if(addon.version!=item.version){%> + <% if(typeof item.releaselist !="undefined" && item.releaselist.length>1){%> + <span class="btn-group"> + <a href="javascript:;" class="btn btn-xs btn-info btn-success btn-upgrade" + data-version="<%=item.version%>"><i class="fa fa-cloud"></i> {:__('Upgrade')}</a> + <a class="btn btn-xs btn-info dropdown-toggle" data-toggle="dropdown" + href="javascript:;"> + <span class="fa fa-caret-down"></span> + </a> + <ul class="dropdown-menu"> + <% for(var j=0;j< item.releaselist.length;j++){ %> + <li><a href="javascript:;" class="btn-upgrade" + data-version="<%=item.releaselist[j].version%>"><%=item.releaselist[j].version%></a></li> + <% } %> + </ul> + </span> + <% }else{%> + <a href="javascript:;" class="btn btn-xs btn-info btn-upgrade" title="{:__('Upgrade')}" data-version="<%=item.version%>"><i + class="fa fa-cloud"></i> {:__('Upgrade')}</a> + <% }%> + <% }%> + <% if(addon.config){ %> + <a href="javascript:;" class="btn btn-xs btn-primary btn-config" title="{:__('Setting')}"><i class="fa fa-pencil"></i> + {:__('Setting')}</a> + <% } %> + <a href="javascript:;" class="btn btn-xs btn-danger btn-uninstall" title="{:__('Uninstall')}"><i class="fa fa-times"></i> + {:__('Uninstall')}</a> <% } %> - <a href="javascript:;" class="btn btn-xs btn-danger btn-uninstall" title="{:__('Uninstall')}"><i class="fa fa-times"></i> - {:__('Uninstall')}</a> - <% } %> - - </div> -</script> \ No newline at end of file +</script> +<!--@formatter:on--> \ No newline at end of file diff --git a/application/admin/view/auth/adminlog/detail.html b/application/admin/view/auth/adminlog/detail.html index b63f943..2adb905 100644 --- a/application/admin/view/auth/adminlog/detail.html +++ b/application/admin/view/auth/adminlog/detail.html @@ -9,7 +9,7 @@ {volist name="row" id="vo" } <tr> <td>{:__($key)}</td> - <td>{$vo}</td> + <td>{$vo|htmlentities}</td> </tr> {/volist} </tbody> diff --git a/application/common/library/Auth.php b/application/common/library/Auth.php index 102199d..5822241 100644 --- a/application/common/library/Auth.php +++ b/application/common/library/Auth.php @@ -256,7 +256,7 @@ class Auth try { $salt = Random::alnum(); $newpassword = $this->getEncryptPassword($newpassword, $salt); - $this->_user->save(['password' => $newpassword, 'salt' => $salt]); + $this->_user->save(['loginfailure' => 0, 'password' => $newpassword, 'salt' => $salt]); Token::delete($this->_token); //修改密码成功的事件 @@ -298,6 +298,8 @@ class Auth //记录本次登录的IP和时间 $user->loginip = $ip; $user->logintime = $time; + //重置登录失败次数 + $user->loginfailure = 0; $user->save(); diff --git a/application/config.php b/application/config.php index cdd9493..64fda49 100755 --- a/application/config.php +++ b/application/config.php @@ -265,6 +265,8 @@ return [ 'login_failure_retry' => true, //是否同一账号同一时间只能在一个地方登录 'login_unique' => false, + //是否开启IP变动检测 + 'loginip_check' => true, //登录页默认背景图 'login_background' => "/assets/img/loginbg.jpg", //是否启用多级菜单导航 @@ -272,7 +274,7 @@ return [ //自动检测更新 'checkupdate' => false, //版本号 - 'version' => '1.0.0.20190930_beta', + 'version' => '1.0.0.20191101_beta', //API接口地址 'api_url' => 'https://api.fastadmin.net', ], diff --git a/public/assets/js/backend/addon.js b/public/assets/js/backend/addon.js index 1349bfe..94e9d9a 100644 --- a/public/assets/js/backend/addon.js +++ b/public/assets/js/backend/addon.js @@ -441,19 +441,17 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form', 'template'], function var userinfo = Controller.api.userinfo.get(); var uid = userinfo ? userinfo.id : 0; - if ($(that).data("type") !== 'free') { - if (parseInt(uid) === 0) { - return Layer.alert(__('Not login tips'), { - title: __('Warning'), - btn: [__('Login now'), __('Continue install')], - yes: function (index, layero) { - $(".btn-userinfo").trigger("click"); - }, - btn2: function () { - install(name, version, false); - } - }); - } + if (parseInt(uid) === 0) { + return Layer.alert(__('Not login tips'), { + title: __('Warning'), + btn: [__('Login now')], + yes: function (index, layero) { + $(".btn-userinfo").trigger("click"); + }, + btn2: function () { + install(name, version, false); + } + }); } install(name, version, false); }); diff --git a/public/assets/js/fast.js b/public/assets/js/fast.js index 388ebdd..695ab00 100644 --- a/public/assets/js/fast.js +++ b/public/assets/js/fast.js @@ -83,7 +83,7 @@ define(['jquery', 'bootstrap', 'toastr', 'layer', 'lang'], function ($, undefine Fast.events.onAjaxError(ret, error); } }, options); - $.ajax(options); + return $.ajax(options); }, //修复URL fixurl: function (url) { diff --git a/public/assets/js/require-backend.min.js b/public/assets/js/require-backend.min.js index 4c292c2..2eb7127 100644 --- a/public/assets/js/require-backend.min.js +++ b/public/assets/js/require-backend.min.js @@ -743,7 +743,7 @@ define('fast',['jquery', 'bootstrap', 'toastr', 'layer', 'lang'], function ($, u Fast.events.onAjaxError(ret, error); } }, options); - $.ajax(options); + return $.ajax(options); }, //修复URL fixurl: function (url) { diff --git a/public/assets/js/require-frontend.min.js b/public/assets/js/require-frontend.min.js index c2c58e0..a9e1774 100644 --- a/public/assets/js/require-frontend.min.js +++ b/public/assets/js/require-frontend.min.js @@ -736,7 +736,7 @@ define('fast',['jquery', 'bootstrap', 'toastr', 'layer', 'lang'], function ($, u Fast.events.onAjaxError(ret, error); } }, options); - $.ajax(options); + return $.ajax(options); }, //修复URL fixurl: function (url) { -- libgit2 0.24.0