后台登陆防刷、防爆破以及正常的登录校验

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了后台登陆防刷、防爆破以及正常的登录校验相关的知识,希望对你有一定的参考价值。

参考技术A 前几天项目上需要对一个正常登陆接口,以及忘记密码的接口进行防爆破处理,这里我用nginx,redis,以及前端的一些简单的图形拖动来做一个简单的安全机制,可能有不完善的地方,大家可以提出来意见。

其实一个接口是无法完全避免接口爆破的,区分人和机器或许可以使用谷歌的图片验证机制,但是我们一般简单项目没必要做那么复杂的,只需要确保不正常的访问频率不会爆破出我们的用户信息,以及让我们机器的处理流量保存在可控范围即可。

验证码只能60s获取一次 并且3小时内只能获取三次,超过次数提升获取频繁,稍后再试。

正常登录1小时内失败6次账号自动锁定,1小时之后自动解锁。

获取验证码无论输入的账号存在不存在均显示发送成功,但是实际不存在的账号不会正常发送。

4.登录失败,账号不存在密码错误不再提示账号不存在等等,而是统一显示账号或密码错误。5.忘记密码前端部分增加滑动校验,60倒计时无法点击发送验证码。前后端共同校验。6.技术限制系统此接口的访问频率。

前端部分可以在这个地址看看这几个简单的组件,这次我们就使用最简单的,滑动拖动即可。

<drag-verify

              ref="dragVerify"

              :width="width"

              :height="height"

              text="请按住滑块拖动"

              successText="验证通过"

              :isPassing.sync="isPassing"

              background="#ccc"

              completedBg="rgb(105, 231, 251)"

              handlerIcon="el-icon-d-arrow-right"

              successIcon="el-icon-circle-check"

              @passcallback="passcallback"

          >

          </drag-verify>

用户滑动之后需要加上60s倒计时,这块我们使用定时器实现即可,以及邮箱和手机号的正确性校验,不正确则弹窗提示。

this.countDown = 60;

      timer = setInterval(() =>

        if (this.countDown - 1 >= 0)

          this.countDown -= 1;

        else

          clearInterval(timer);

          timer = null;

       

      , 1000);

<el-button disabled type="text" v-show="time > 0">

time > 0 ? `$time` : "" s之后重试</el-button>

验证邮箱手机号可以使用正则校验进行。

mobileReg = /^1\d10$/;

      emailReg = /^([A-Za-z0-9_\-\.\u4e00-\u9fa5])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]2,8)$/;

前端大体思路就是,进行滑块验证,拖到右边之后,60s之内无法操作,60s到期之后自动复原,

显示倒计时时间。这个只能防止用户在页面上多次点击,造成一个验证的假象,如果直接对后端接口爆破,则无法避免。

这是大概的流程图,图中还有些细节问题下面慢慢讲解。

这块本来我想用java或者kotlin写,但是历史项目用go写的,重写的话还有其他一些改动,所以继续使用golang完成这部分逻辑。

先定义一个结构体,然后我们来分析下需要哪些字段来实现我们的业务。

type CommonLogin struct

    CreateTime time.Time

    LastTime  time.Time

    Times      uint8



// 登录的前置校验

func beforeCommonLoginValid(key string, r *redis.Client, field string) (bool, error)

    // redis中是否存在账号

    result, err := r.HExists(field, key).Result()

    if err != nil

            fmt.Printf("从redis中获取用户账户失败,账户为: %s", key)

            return false, err

   

    if result

            login := &CommonLogin

            // 存在账号 说明之前登录失败过 且自从上次失败未登录成功过

            commonLogin, err := r.HGet(field, key).Result()

            if err != nil

                    return false, err

           

            json.Unmarshal([]byte(commonLogin), login)

            if login.Times < 6

                    return true, nil

           

            // 是否在1小时内失败了6次

            if login.Times >= 6

                    // 否

                    if time.Now().Sub(login.CreateTime) > time.Hour*1

                            // 连续输错6次时长大于1小时 解锁

                            r.HDel(field, key)

                            return true, nil

                    else

                            fmt.Printf("用户%s于1小时之内连续登录失败6次,账号锁定,1小时后重试。", key)

                            return false, nil

                   

           

   

    // redis中不存在重试记录

    return true, nil



在所有的登录判断的出口,调用此方法即可,例如用户名密码错误,acl校验未通过等等。

其实原理差不多,唯一的区别就是多了一个获取验证码时间间隔校验。

func beforeForgotPasswordValid(key string, r *redis.Client, field string) (bool, error)

    // redis中是否存在账号

    result, err := r.HExists(field, key).Result()

    if err != nil

            fmt.Printf("从redis中获取用户账户失败,账户为: %s", key)

            return false, err

   

    login := &CommonLogin

    // 账号存在

    if result

            commonLogin, err := r.HGet(field, key).Result()

            if err != nil

                    return false, err

           

            json.Unmarshal([]byte(commonLogin), login)

            // 获取验证码间隔时长不能小于60s

            if time.Now().Sub(login.LastTime) < time.Second*60

                    fmt.Printf("用户获取验证码间隔小于60s")

                    return false, nil

           

            if login.Times < 3

                    return true, nil

           

            // 是否在1小时内获取了3次

            if login.Times >= 3

                    // 否

                    if time.Now().Sub(login.CreateTime) > time.Hour*3

                            // 连续输错6次时长大于1小时 解锁

                            r.HDel(field, key)

                            return true, nil

                    else

                            fmt.Printf("用户%s于3小时之内连续获取验证码3次,账号锁定,3小时后重试。", key)

                            return false, nil

                   

           

   

    return true, nil



// 更新获取验证码的时间

func afterForgotPasswordValid(key string, r *redis.Client, field string)

    login := &CommonLogin

    commonLogin, _ := r.HGet(field, key).Result()

    json.Unmarshal([]byte(commonLogin), login)

    // 验证码发送成功

    result, _ := r.HExists(field, key).Result()

    if result

            login.Times = login.Times + 1

            login.LastTime = time.Now()

            data, _ := json.Marshal(login)

            r.HSet(field, key, data)

    else

            login.Times = 1

            login.LastTime = time.Now()

            login.CreateTime = login.LastTime

            data, _ := json.Marshal(login)

            r.HSet(field, key, data)

   



nginx是一个非常强大的中间价,在安全方面,我们可以用它来限制来自于同一机器的访问频率,可以做黑名单功能等等,当然有人会说ip代过滤理池之类的,我们此次演示的只是简单demo,恶意攻击当然需要专业防护了。

具体google一下,看这两篇官方文档。

https://docs.nginx.com/nginx/admin-guide/security-controls/controlling-access-proxied-http

https://www.nginx.com/blog/rate-limiting-nginx/

具体的配置其实很简单了。

限制远程同ip访问频率。

limit_req_zone$binary_remote_addrzone=perip:10mrate=1r/s;

$binary_remote_addr 表示通过remote

addr这个标识来做限制,“binary ”的目的是缩写内存占用量,是限制同一客户端ip地址

zone=one:10m表示生成一个大小为10M,名字为one的内存区域,用来存储访问的频次信息

rate=1r/s表示允许相同标识的客户端的访问频次,这里限制的是每秒1次,还可以有比如30r/m的

location ^~ /api/xxx

        limit_req zone=perip nodelay;

        limit_req_status 503;

        proxy_pass http://正确地址;

   

上面配置意思就是超过频率返回503,服务不可用。

使用jmeter进行压力测试:1s 10个请求,我们预期只有1个请求成功,其他的返回503.

wordpress登陆界面黑屏

1、wordpress 被黑,WordPress无法正常加载页面?
第一种:自己在后台修改了wordpress网址,导致不能登陆后台。
解决办法:
1、首先我们登录MySQL数据库,这个不用我教吧;
2、查看表”wp_options”的数据(你的表不一定是以”wp”开始的);
3、修改”option_name “为”siteurl”和”home”的两条记录(一般在第一页和第二页),将内容改为之前能够正常使用的地址;
4、保存数据后,就可以重新登录网站和后台了。
第二种:wordpress 主题丢失以及后台无法进入。
症状:
后台进不去。当在浏览器栏里面输入后台文件的位置的时候会出现404页面错误。主题丢失。博客首页的所有的样式全部失效,页面就剩下一个纯文字的页面。在浏览器里面输入无论是http://www.seonote.net/blog/wp-admin还是http://www.seonote.net/wp-admin 都得到是相同的错误:缺少wp-login.php文件。
原因:
在后台设置了一下,拿seo笔记做个例子,也就是把那个后面的那个blog给去掉了,就导致了上面的问题。
解决办法:
确认目录里面是有wp-login.PHP这个文件的,应该不是缺少文件引起的,既然文件是存在的,但报错的时候却说是不存在,那么只有一个原因,wp-admin这个页面的文件不知道到哪里去找wp-login.php这个文件,另外主题的消失也应该是因为不知道到什么地方去找相应的主题而引起的。
因为在后台错误的设置引起了现在的状况,只要将那个改回来应该就没事了,但是现在后台是进不去,只能从数据库中想办法。查找了相关的信息以后发现wordpress是将路径信息存放在wp_options这张表里面的。下面就说一下具体解决方案:
通过Cpanel面板进入phpmyadmin页面。选择你写的博客的数据库。选择wp_options这张表,转换到Browse(浏览)模式。将siteurl的值改回http://www.seonote.net/blog 。至此,wordpress知道如何去寻找相应的主题和页面了,问题解决。
说直白了做这个事情的目的就是让http://www.seonote.net/能够自动的转向到http://www.seonote.net/blog ,这个可以用301转向来做,具体方法网上有很多,有兴趣的可以搜搜看看。
第三种:wordpress上传服务器后只能打开首页链接,其他链接都不行,后台可以打开。
先把固定连接改成默认,删除根目录下的.htaccess 文件;再把固定连接改回来,这时候就会自动生成一个.htaccess 文件。
第四种:前台可以显示,后台不能登陆显示空白。
解决办法:
一般这种情况主要是wordpress插件的问题,首先使用你的FTP工具连接到你的空间,然后进入到wordpress的FTP安装目录,将wp-content目录下的plugins文件夹改名,也就是说将“plugins”改成了“plugin”,这样前台调用插件的那些模块便会出现”Database Results Error”。这个时候你的wordpress后台便已经可以登陆了。登陆的地址是:http://你的博客地址/wp-login.php,比如:http://www.seonote.NET/wp-login.php,登陆以后你便可以在管理后台的插件的栏目,看到所有的插件都已停用,这个时候你便可以将“plugin”文件夹名字改回到原来的名称“plugins”,之后可以逐一调试找到出问题的插件。
第五种:升级wordpress导致后台不能登陆。
直接去ftp上,把wp-content下的object-cache.php改个名字或者删除,再进后台,OK。
因为这个“非插件”的object-cache能大大减少查询,对提速还是有很大作用,相信看过相关文章的站长都用过。但其实wp3.0已经把这个归类于内部插件了,可能会导致一些未知问题。我觉得有时候缓存尤其是数据库的缓存会影响升级,安装插件的莫名问题。当做这些操作出现奇怪问题时,先去检查一下这个。
PS:这个object-cache很好用的,改名进去后台后。或是成功启用插件后,再改回来测试,没有问题了,估计是缓存更新了。
第六种:修改代码导致网站错误,前台只显示首页,后台空白不能登陆。
直接用备份的文件直接覆盖所有文件!在themes文件夹下多出了一个idream.bk的文件,进入idream.bk文件夹发现里面全是原来的文件,但是idream里面却多了一些别的文件,将idream文件随便令命名,然后将idream.bk文件改为idream,刷新网页后发现后台可以登陆了,但是主题却没有出现,首页还是一片纯文字页面,进入后台“外观”-“主题”-启用idream主题后台,后台又出现了空白,前台没有变化。直接将原来的idream文件删除,只留下重命名为idream的idream.bk文件夹,刷新网页正常显示了。
对照看看是否能帮到你。

2、如何限制WordPress后台管理员密码错误登陆次数?
这个要根据服务器不同的生产环境来采用不同的应对办法的,一般需要现在 WordPress 后台登陆的场景都是因为被恶意扫描登陆的情况下的。造成被这样恶意登陆的主要原因就是暴露了服务器真实IP,应对方法可以总结如下几个:
通过WEB服务器限制wp-login.php文件的访问
WEB服务器限制同一时间的并发访问数量和限定速度上限
服务器端加上带有WAF防御的 CDN 服务器(推荐360网站卫士和百度云加速)
服务器防火墙拦截屏蔽这类非法的恶意请求
当然,最土豪的办法其实就是在做以上这些措施的时候,变更一下服务器的真实IP地址,因为暴露了真实IP地址以后,这类恶意请求都是有针对性的,拦截和屏蔽效果会差了很多,同时也容易引来CC/DDOS攻击。
一个十年草根博客站长【明月登楼的博客】(imydl.com)熟悉 WordPress 、 Typecho 博客平台创建、运营网站,多年VPS服务器运维经历,实践经验丰富,在这里为您解答专业方面的所有疑问!
3、zblog和wordpress的区别?
1.开发团队
用一个程序,了解开发团队是很有必要的。不然被人卖了还不知道是谁干的,那就十分尴尬了。Zblog属于国产团队开发制作,具体介绍可以参见Zblog官方网站的介绍。而Wordpress是全球风靡的Blog程序,前一阵WP官网发布了中文版,查看具体情况参见Wordpress官方中文站。
2.程序语言
这点其实不想谈太多,不过出于长远目光来看,还是有必要声明下。Zblog是asp程序,Wordpress是Php程序。国内流行asp大部分是因为盗版的猖獗与版权意识淡薄,而今后中国的版权发展状况如何也会影响到asp程序的应用推广。而国外几乎清一色的php程序,很大的原由是Php的开源免费。
3.空间支持
基本上国内符合asp程序的空间很多,但在国外比较少。而要想更好的操作Wordpress最好选用国外的空间,因为比较好的支持程序静态化。国内的空间商虽然支持php没有问题,但静态化支持方面不是很理想。同时国外空间更廉价,基本都是限制每月流量,国内的空间商贵限制IIS、CPU占用等。而当你的博客访问量增大,国内的空间就会让你感到懊恼了。
4.操作性
相比而言,Zblog功能操作方面更符合国人习惯,比如有文章置顶、模板的自动安装、文章编辑等。Wordpress在2.7版本后对后台界面也进行了改善,不过整体的操作性而言,还是有待继续改善,毕竟是非国人的创作。Zblog转移备份之类十分简单,就如一个绿色软件;而Wordpress转移与备份还要涉及数据库,相对繁琐一点。
5.插件模板
插件模板方面其实Wordpress比Zblog要丰富得多,利用各种插件可以实现很多功能,同时由于Wordpress的流行度使得模板数量比Zblog也要多得多。而相比而言,Zblog的插件与模板在数量上与Wordpress还是有差距。Wordpress可以后台预览模板再使用,而Zblog模板只能套在官方的程序上预览,不够贴切。不过在插件上,虽然Zblog的数量较少,但插件功能方面比较贴近国人的需求。同时随着Zblog的用户增加,模板与插件的数量在不断的增加。
6.SEO与推广
在SEO方面,其实Wordpress与Zblog各具特色。不过个人感觉Wordpree在Google方面还是比Zblog有优势,Zblog相比Wordpress的SEO优势其实并不是很多人说的程序先天性,而是更便捷的Diy,而最终效果如何要看自己的SEO水平与项目决定。在推广方面,Wordpress可以跟踪谷歌博客搜索的外部链接,这是十分吸引人的地方。
7.用户反馈
用户反馈其实还包括防SPAM,恶意留言现在已经成为Blogger的一个苦恼。Wordpress与Zblog都有反SPAM与恶意留言的插件,而Wordpress更容易屏蔽边缘性的留言。而Zblog实行的是链接转向,所以要更人性点。相比反馈方面,正如上面提到的Wordpress可以跟踪谷歌博客搜索的外部链接,所以可以与其他blogger进行很好的反馈跟踪。
目前而言,如果追求操作便捷性与国人习惯,更推荐Zblog。如果想更好的DIY与持久blogger,更推荐Wordpress。至于自己的技术如何其实并不重要,程序用得久了自然会。
4、如何优化一个臃肿的WordPress让其照样能飞起来?
第一,WordPress 并不臃肿,反而很精简!
第二,臃肿是因为主题和插件而导致的。
第三,飞起来需要优化这些主题和插件:
换成更简洁的主题(通常付费主题会更好)
将不需要的插件删掉
安装缓存插件 wp-rocket、wp-super-cache 等等
https://www.wanghuiblog.com/post/pagespeed-optimize/
更多详细 WordPress优化技巧
我这个网站就是 WordPress 做的,是不是飞快
更多关于 WordPress 话题,前往:王会的博客 https://www.wanghuiblog.com
5、wordpress的安装页面怎么都打不开?
更正一下是nginx,做站是一个折腾的过程,一定要细心,有时候一点小细节不注意就会把人搞死,一点小建议哈。
报404是找不到页面,建议你把所有的W P文件全部删除,并且数据库清空在拷贝安装一次,如果还不行,建议你把vps重置,重新安装LNMP,安装好后先打开你的vps服务器ip地址或域名看能不能打开页面,如果能则检查安装包是不是损坏或缺失文件,建议从官网重新下载。
如果依然报错,建议换成LAMP进行尝试,wp官方是推荐apache的,另外nginx在配置.htaccess重定向文件时也比较方便,nginx就需要转码后才可
参考技术A 第一种:自己在后台修改了wordpress网址,导致不能登陆后台。
解决办法:
1、首先我们登录MySQL数据库,这个不用我教吧;
2、查看表”wp_options”的数据(你的表不一定是以”wp”开始的);
3、修改”option_name “为”siteurl”和”home”的两条记录(一般在第一页和第二页),将内容改为之前能够正常使用的地址;
4、保存数据后,就可以重新登录网站和后台了。
第二种:wordpress 主题丢失以及后台无法进入。
症状:
后台进不去。当在浏览器栏里面输入后台文件的位置的时候会出现404页面错误。主题丢失。博客首页的所有的样式全部失效,页面就剩下一个纯文字的页面。在浏览器里面输入无论是http://www.seonote.net/blog/wp-admin还是http://www.seonote.net/wp-admin 都得到是相同的错误:缺少wp-login.php文件。
原因:
在后台设置了一下,拿seo笔记做个例子,也就是把那个后面的那个blog给去掉了,就导致了上面的问题。
解决办法:
确认目录里面是有wp-login.PHP这个文件的,应该不是缺少文件引起的,既然文件是存在的,但报错的时候却说是不存在,那么只有一个原因,wp-admin这个页面的文件不知道到哪里去找wp-login.php这个文件,另外主题的消失也应该是因为不知道到什么地方去找相应的主题而引起的。
因为在后台错误的设置引起了现在的状况,只要将那个改回来应该就没事了,但是现在后台是进不去,只能从数据库中想办法。查找了相关的信息以后发现wordpress是将路径信息存放在wp_options这张表里面的。下面就说一下具体解决方案:
通过Cpanel面板进入phpmyadmin页面。选择你写的博客的数据库。选择wp_options这张表,转换到Browse(浏览)模式。将siteurl的值改回http://www.seonote.net/blog 。至此,wordpress知道如何去寻找相应的主题和页面了,问题解决。
说直白了做这个事情的目的就是让http://www.seonote.net/能够自动的转向到http://www.seonote.net/blog ,这个可以用301转向来做,具体方法网上有很多,有兴趣的可以搜搜看看。
第三种:wordpress上传服务器后只能打开首页链接,其他链接都不行,后台可以打开。
先把固定连接改成默认,删除根目录下的.htaccess 文件;再把固定连接改回来,这时候就会自动生成一个.htaccess 文件。
第四种:前台可以显示,后台不能登陆显示空白。
解决办法:
一般这种情况主要是wordpress插件的问题,首先使用你的FTP工具连接到你的空间,然后进入到wordpress的FTP安装目录,将wp-content目录下的plugins文件夹改名,也就是说将“plugins”改成了“plugin”,这样前台调用插件的那些模块便会出现”Database Results Error”。这个时候你的wordpress后台便已经可以登陆了。登陆的地址是:http://你的博客地址/wp-login.php,比如:http://www.seonote.NET/wp-login.php,登陆以后你便可以在管理后台的插件的栏目,看到所有的插件都已停用,这个时候你便可以将“plugin”文件夹名字改回到原来的名称“plugins”,之后可以逐一调试找到出问题的插件。
第五种:升级wordpress导致后台不能登陆。
直接去ftp上,把wp-content下的object-cache.php改个名字或者删除,再进后台,OK。
因为这个“非插件”的object-cache能大大减少查询,对提速还是有很大作用,相信看过相关文章的站长都用过。但其实wp3.0已经把这个归类于内部插件了,可能会导致一些未知问题。我觉得有时候缓存尤其是数据库的缓存会影响升级,安装插件的莫名问题。当做这些操作出现奇怪问题时,先去检查一下这个。
PS:这个object-cache很好用的,改名进去后台后。或是成功启用插件后,再改回来测试,没有问题了,估计是缓存更新了。
第六种:修改代码导致网站错误,前台只显示首页,后台空白不能登陆。
直接用备份的文件直接覆盖所有文件!在themes文件夹下多出了一个idream.bk的文件,进入idream.bk文件夹发现里面全是原来的文件,但是idream里面却多了一些别的文件,将idream文件随便令命名,然后将idream.bk文件改为idream,刷新网页后发现后台可以登陆了,但是主题却没有出现,首页还是一片纯文字页面,进入后台“外观”-“主题”-启用idream主题后台,后台又出现了空白,前台没有变化。直接将原来的idream文件删除,只留下重命名为idream的idream.bk文件夹,刷新网页正常显示了。

以上是关于后台登陆防刷、防爆破以及正常的登录校验的主要内容,如果未能解决你的问题,请参考以下文章

wordpress登陆界面黑屏

为啥使用suphp类型之后网站后台登陆老是提示验证错误呢?

短信验证登录实现流程

你好,网站后台管理怎么登陆?

zabbix监测web站点以及用户是否能正常登陆

HTML+CSS实现这个登录界面