网站安全监测 - Node实战

news/2024/4/29 14:45:18/文章来源:https://blog.csdn.net/weixin_34009794/article/details/89224387

本文最早发表在我的个人博客上,转载请保留出处 http://jsorz.cn/blog/2016/11/node-action-in-website-detection.html

(这是拖了近一年的文章。。。)去年这个时候接了一个心力交瘁的项目,大体目标是:1、为用户的网站提供安全监测的服务,用户在我们的管理端系统中添加一个站点并勾选要检测的项;2、然后由后台爬虫系统完成用户站点链接的入库,并定时针对站内链接执行各种检测任务;3、再由前端系统给用户交付网站监测报表。在中间这一步,最重要的爬虫系统,我第一次学习用 Nodejs 来做。

Node起步

安装

  • nvm

    curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.25.2/install.sh | bash
  • node 0.12.x

    nvm install 0.12
  • cnpm 镜像

    npm install --registry=http://r.cnpmjs.org -g cnpm
  • debug 工具

    cnpm install -g node-inspector
    node-debug yourApp.js

教程

  • Node.js 包教不包会

  • 中文API文档

一些库

  • 用于爬虫

    • superagent 处理请求的模块

    • request 另一个处理请求的模块,比起 superagent,语法配置项更多一些。如果说 superagent 是 $.post(),那 request 就是 $.ajax()

    • cheerio 用于DOM解析,提供与 jquery 选择器类似的接口

  • 异步流程控制

    • Q in Github Promise 化的一种实现,promise 不是万能,改造复杂的动态决定的执行链是比较烦的事情

    • async 点赞数很高的库,有人说有毒,我觉着很好用

    • eventproxy @朴灵的基于事件的流程控制,我觉着和 promise 或 async 搭配着使用很好用

主程序设计

在摘要中已经提到,这个项目的目标分为3步:添加检测任务 => 爬虫执行任务 => 前端报表展现。但在具体实现时,需要对爬虫进行细分,最终会有6步过程。

1、添加要监测的站点

20161121_create_task_1.png

在web端添加一个站点任务,输入客户的摘要信息以及要监控的站点列表,然后可以更改检测类别的周期以及具体检测项等配置。

20161121_create_task_2.png

20161121_create_task_3.png

“可用性”检测主要是网站的一些基本信息,通常都在首页的 http 头中就能找到。而“内容检测”需要对网站中的所有页面进行检测,因此会有一个“检测深度”和“最大页数”的配置,页面深度越深,页面数目会呈指数级增长,这对爬虫服务器是巨大的压力。

此外还有一个“安全检测”的模块,具体检测项有:ActiveX挂马,iframe挂马,js挂马,WebShell后门,暗链,以及后台地址检测。由于我对安全方面了解太少,在这个系统中实现得也很simple,就不多说了。。。

2、站点入库

由于上面“内容检测”和“安全检测”都需要对网站首页下的其他页面全部检测,因此我们需要维护一个 site 表和 site_link 表,记录下网站的域名和 ip 信息,并且存下每个页面链接的信息,包括该页面相对于首页的深度层级,该页面的链接是 同源同域 还是 外链,以及页面的发现时间、状态信息等。

另外注意的是,从首页开始取链接,然后再对链接再取它的后继链接,整个过程应采用“广度优先”的策略。而“检测深度”和“最大页数”也是在这个时候进行限制的,如果当前页面深度为 N,N + 1 > 检测深度,那么该页面就不再往爬取队列中 push 后继链接了。

3、周期性生成检测任务

站点任务配置完,站点链接也入完库,这时候就可以根据上面配置的检测周期来定时产生任务。例如当内容检查的周期到来时,需要取出该站点下所有符合的页面链接,对每个页面的每个检测项都生成1个检测任务。

需要注意生成任务时,要按照页面链接的顺序来遍历,而不是先遍历检测项。这样的好处是当具体爬虫执行时,相同 url 的检测任务在队列中会连续挨着,这样可以给爬虫做爬取的合并,同样的 url 只需要爬取1遍,就可以给不同的检测任务去执行。

4、爬虫执行检测任务

如果说第3步生成任务是“生产者”,那么现在就轮到“消费者”。爬虫系统要支持并发,多机器 + 多线程。在1台机器上,1次从任务队列中取100个出来,如第3步所说检测任务是按相同url连续排列的,那么这100个检测任务可以抽出20个任务组(举个例子),每个任务组都可以只爬取1个页面,然后将内容传递给各检测项去执行。而每个检测项的执行结果都以 log 的形式存储。

如果爬虫的机器不是那种“树莓派”微型机器,那可以先将 log 以文件形式存到本地,留出带宽给爬虫。或者每个检测项的结果 log 都发送到1个指定的地方,这就会多占用带宽,也需要专门搞1台日志服务器。

5、定时计算日志

爬虫的任务执行过程是很连续又很离散的,连续是因为做完1个就要做下1个,离散是说日志的离散,单独1个页面的1个检测项的1次执行日志并没有太大意义,要整合到整个站点和时间段、检测类别的维度来看才有价值。从前面的步骤可以看到,站点链接的入库以及周期性的生成任务时,会有一定的“顺序”控制,并且只有全部入完库才会进入下一步骤。而爬虫系统是很离散的,它可能分布到多台机器上,只要任务队列中有东西,它就会取出来执行,也不会区分任务是来自哪个站点哪个类别的。

因此,如果 log 分布在各爬虫机器上,那就需要一个定时的脚本对其进行汇总计算后传回数据中心。而如果有统一的日志服务器,那同样需要将原始日志计算成有效的数据。

6、前端报表查询

前端系统直接查数据中心,可以得到站点级和检测类别级的报告。前面“生产者”生成检测任务时,会在数据库中打上一些任务模块的时间信息,前端系统也能够查到一些调度状态信息。

架构图

整个系统分为4个部分:前端系统、任务Producer、爬虫系统、日志计算同步进程。架构图如下,可以看到箭头就代表着数据流的方向。

20161121_project_architecture.png

而爬虫调度和执行是典型的“生产者-消费者”模式,这里生产者只有1个,而有N个消费者爬虫进程。

20161121_producer_and_runner.png

所谓的检测任务队列,实际就是数据库中的一张表,多个爬虫进程或多台爬虫机器都共享这张表,只要保证从表的顶部开始读取,读完后就要重置状态位,防止被其他进程重复读取。而当任务执行失败后,会将该检测任务的记录移到 table 的队尾,并设置1个失败次数的字段。

爬虫实现思路

技术框架

在本文第一节中就列出了一些库,在页面爬取方面,使用 superagent 获取页面内容,使用 cheerio 做文档解析。而对于一些不需要解析内容的爬取任务(比如查询某个页面的 header 信息,或是检查某个页面是否 200 状态),使用 request 来发请求。

对于爬虫系统中最关键的异步流控制,我在实现时做了多种风格的尝试,在数据库读写层面使用 promise 风格,在检测项内部使用 async,而在爬虫的实例中使用 eventproxy 来进行流控制。

目录结构

  • base/ 跟继承和通用相关的

  • conf/ 各种配置项(检测项的配置、规则的配置)

  • constant/ 各种常量的定义和配置

  • database/ 数据库配置和连接池

  • models/ 数据库表对应的 json schema

  • dao/ 与 model 相应的 Dao 增删改查封装

  • util/ 通用数据的helper

  • factory/ 工厂封装类,统一任务的组建过程

  • modules/ 具体检测项 (爬虫上搭载的具体task实现)

    • basic/ 基础信息 可用性检测

    • content/ 内容检测大类

    • secure/ 安全检测大类

    • common/ 站点入库、链接入库,以及抓取页面内容也抽象成1个通用task

  • crawler/ 爬虫对象与池管理(1个crawler实例只负责1次页面请求)

  • scheduler/ 监控和调度进程 (每隔一段时间就执行一轮)

    • runner.js 用来执行检测任务 (任务消费者)

    • siteRunner.js 针对“站点链接入库”的 runner

  • app.js 主程序,用来启动 runner

  • appSite.js 主程序之一,用来启动 SiteRunner

  • appPath.js 用来启动低频高请求量的检测任务(详见下面的地址型检测类)

爬虫实现流程

由上面的结构可以看到,程序运行时的调用过程是:app.js => runner.js => crawler => 具体检测项。

app.js

其中 app.js 只是个程序入口,里面构造了一些参数给 runner,代表性的参数有:runner 每轮执行时取出的任务数量(即1个消费者每次消耗的数量),以及每轮执行之间的间隔时间(因为执行1轮任务时会有 N 个请求,如果不做间隔时间的限制,同时等待请求响应的线程太多会爆)。

runner.js

runner.js 首先提供1个支持间隔时间的循环执行接口,这里使用 async 库来实现。

RunnerBase.prototype = {start: function(){var that = this;that._count = 0;async.whilst(function(){if(that.loopCount){return that._count < that.loopCount;}return true;},function (callback){// 第一次立即执行if(!that._count){that._count = 1;that.run();callback(null, that._count);}else{that._count++;setTimeout(function(){that.run();callback(null, that._count);}, that.loopInterval || 10000);  // 默认10秒间隔}},function (n){console.log('Runner with [n=' + n + ']');});}
};

而 runner 中的run()方法就是每轮具体要执行的操作,它其实整体是个串行过程,有以下步骤:

  • 1、取出数据库中的任务队列中靠前的 N 个任务

  • 2、如果取出为空,直接跳到第6步

  • 3、将任务状态标为 PROCESSING

  • 4、对 N 个任务按检测的 url 重新分组,比如得到 M 个组,则构造 M 个 Crawler 实例(这里设计的准则就是1个 Crawler 实例只爬取1个页面

  • 5、使用 async.parallel 并行执行 M 个 Crawler 的 run() 方法

  • 6、一轮 runner 执行结束

这里整体是串行,使用了 eventproxy 来进行流程控制

Runner.prototype.run = function(cb){var that = this;var ep = new EventProxy();// 统一错误处理 TODOep.fail(function (err){console.log(err);});// 各步骤一起调用,通过 event信号 等待Runner.steps.forEach(function (fn){fn.call(that, ep, cb);});
}

而其中最关键的步骤是并行执行 M 个 Crawler,其实现原理如下

function (ep){var that = this;ep.on('crawlerReady', function (crawlers){// 构造 async.parallel 的执行函数var threads = crawlers.map(function (crawler){return function (callback){// run前的累计that.crawlerCount++;crawler.run(function (err){// run完的累计that.crawlerCountDone++;if (err){console.log(err);callback(err);} else {callback(null);}});}});async.parallel(threads, function (err, res){console.log('[OK] 并行Crawler[len=' + threads.length + ']执行完毕');});// 这里释放信号不能放在 async.parallel 的回调里,以防有爬虫挂了就卡死了// 直接到最后1步,可在每轮的最后看到爬虫累计的页面数目,and 爬虫监控池 TODOep.emit('crawlerDone');});
},function (ep, cb){var that = this;ep.on('crawlerDone', function(){console.log('[OK] 消费者1轮, ' +'累计爬了 ' + that.crawlerCount + ' 个页面, ' +'累计结束 ' + that.crawlerCountDone + ' 个页面');cb && cb();});
}

crawler.js

上面已经提到了多次:1个 Crawler 对象只负责 1次 页面请求,在 Crawler 对象中主要记录着分组后的任务数组,它们有着同样的目标 url。先请求页面 url,得到页面文档后将内容依次传递给各检测项去各自执行任务。所以总的来说,这里也是一个串行过程,具体步骤如下:

  • 1、将分组后的任务,通过任务类型的 key,反射到具体的类,得到可执行的任务对象的数组。

  • 2、调用请求页面内容的通用检测项,作为 starter

  • 3、将页面内容的文档作为 context 入参,依次调用各任务对象的数组

  • 4、任务全部完成后,在数据库中将其移出队列;若失败,则先移除,计失败次数+1,然后重新插入队尾

这里也是用 eventproxy 控制流程的,其中关键的 context 传参调用各任务对象,实现如下

function (ep){var that = this;// 使 task.run() 结果按顺序排列ep.after('oneTaskFinished', that.tasks.length, function (results){ep.emit('allTasksFinished', results);    });ep.on('starterFinished', function (context){that.tasks.forEach(function (task){task.run(context, ep.group('oneTaskFinished'));});});
},

注意,使用 ep.group() 方法可以保证得到的执行结果的顺序是与调用顺序一致的,而各 task 的执行是并行的。

检测项工作模式

反射原理

在上面讲 crawler 的第1步中提到:将分组后的任务,通过任务类型的key,反射到具体的类。因为从数据库任务队列取来的检测任务只会含有 模板url / 检测大类 / 检测项小类 这样的数据,所以就要反射到具体的检测类来构造对象。

“反射”是强类型编程语言中的概念(我最早是在 Java 中了解的),而 js 天然的弱类型和动态特性,很容易实现。

// 根据命名规则,取检测模块的引用
getModuleFromCrawlTask: function(crawlTask){var modulePath = ModuleConf.getPath(crawlTask['item_key']);return require(modulePath);
}

这里每个检测项任务都会带有 item_key 字段,表示具体的检测项,其实还有 mod_key,对应到系统的3大类检测:可用性,内容检测,安全检测。具体见下一段。

检测项分类

// 表明这个TaskItem属于哪一大类 (通用的除外)
var modDict = {COMMON_CRAWL: 'COMMON_CRAWL',        // 通用爬取方法 如请求页面document, 取链接等BASIC_DETECT: 'BASIC_DETECT',        // 可用性检测CONTENT_DETECT: 'CONTENT_DETECT',    // 内容检测 合并了篡改检测SECURE_DETECT: 'SECURE_DETECT'        // 安全检测
};// 表明这个TaskItem能否与其他合并, 能否共用1次请求
var typeDict = {EXCLUSIVE: 'EXCLUSIVE',                // 排它性 (独占 request 的任务)INCLUSIVE: 'INCLUSIVE'                // 可合并性 (只需传递 context)
};// 表明这个TaskItem应该在哪个表中, 应该交给哪个Runner处理
var runnerTypeDict = {COMMON: 'COMMON_TASK',                // 普通任务 -> Runner -> app.jsSITE: 'SITE_TASK',                    // 站点入库类 -> SiteRunner  -> appSite.jsPATH: 'PATH_TASK'                    // 路径检测类 -> Runner -> appPath.js
};

这里定义了两种表示任务属性的类型:INCLUSIVE 表示该任务是可以与同目标 url 的其他任务合并的,只需要请求1次页面,传递页面内容的 context 即可,详见 crawler.js 的部分实现代码。而 EXCLUSIVE 表示该任务内部要自己发请求,比如查 Whois 信息,或者要检测是否存在某些后门路径,这类任务是不可以合并的。

runnerType 又是另一个层面的另一种分类,在第二节主程序设计中提到过站点链接入库。我在实现时做了一层抽象,将“站点入库”和“链接入库”也视为一种检测项任务,任务放在单独的一个队列表中。这样就能共用一些 crawler 和 runner 的逻辑。

此外对于路径类检测,比如 Webshell 地址检测,或是敏感路径检测,由于规则的字典很大,1个检测项可能会有上千次请求。因此对于这类“低频”又“高请求量”的检测项,我也单独将任务放在另一个独立的队列表中,也由另一个程序入口启动。

并行与管道

总结整个爬虫调度与检测项的工作流程,是“串行”与“并行”同时存在着。

20161121_runner_task_pipe.png

由 runner 执行时每轮会取出一堆任务,生成多个 crawler 实例,这是并行的。而在每个 crawler 内部可以理解为像工厂的流水线模式,先请求页面 url,然后将页面内容一个个传递给各检测项去完成相应的提取或检测工作。每个检测项内部都会去写各自的 log 文件,最后所有检测任务都完成后,间隔一段时间后会进入下一轮 runner 的执行。

注意的是,检测项是根据目标 url 来分组的,搭载在 crawler 实例上执行的,同一组的检测项都执行完后,相应的 crawler 实例也应该销毁。而 runner 对象的实例是始终存在的,它像一个定时器一样每隔十来秒就会再触发1轮执行。同时,1个 runner 实例应该对应1个进程,多个 runner 实例应该跑在多台爬虫服务器上。

总结与不足

这个项目从去年11月开始需求分析,做界面 demo,到任务分解和组装过程的设计,再到爬虫的实现,也是从零开始学 nodejs,整个过程最初都只有我1个人,对自己的挑战提升很大。熬了两三个月后才有人手帮我做日志的回收计算以及前端的报表部分,之后项目就交给他们了,他们后来做了一些安全检测项方面的强化以及多机器的部署和通信。

我在单机(Mac Air Book @ 2012)上运行的效率平均1小时,爬取近1万个页面,并完成剩余的内容检测项部分。在前面图中一轮取出的任务数量以及并行 Crawler 的数目,对机器的性能和网速都有要求,如果入不敷出(每轮间隔时间内都只有少数的 crawler 执行完),最终会产生很多内存错误,或者 TCP 连接数过多,也得不到结果。

我尝试后得到的经验参数是,每隔 10 秒,取 50 个任务,根据目标 url 合并完后大约有 20~30 个任务组。注:用的是云服务器,内存 2G,带宽 2M。

还是简单粗暴

这个爬虫系统和检测项都还比较简陋,可以从以下方面改进:

  • nodejs 的 cluster 尝试,能否对爬取效率有性能提升

  • 数据库“同步写”的锁问题,多台爬虫机器共用同一个数据库的任务队列,有性能瓶颈(或者说集中式存储的通病)

  • 内容检测方面的篡改识别算法,目前仅用 content-length 和 md5 来判别页面更改

  • 引入 phantomJS 来做网页截图,警示页面恶意篡改

  • 加强安全检测方面的力度,对各种挂马和暗链的代码模式的识别

  • 支持对检测项的扩展,能让更有经验的安全工程师编写的 python 代码也接入到系统中

TODO

  • 在开发过程中还记录了一些遇到的问题,nodejs爬虫实现中遇到的坑 后续会慢慢整理补充

  • 有时间再抽象出一个业务无关的可配置的“生产者-消费者”模式的网站检测框架,供学习交流

本文最早发表在我的个人博客上,转载请保留出处 http://jsorz.cn/blog/2016/11/node-action-in-website-detection.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_706032.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

国内10大技术网站,你最爱和哪个玩耍?

CSDN&#xff0c;掘金&#xff0c;博客园等&#xff0c;说起来都是“技术”社区&#xff0c;每个却都有着不同的姿色和用处。至于说程序员们“物以类聚&#xff0c;人以群分”&#xff0c;我觉得最主要的原因在于“猩猩相惜”。 当你老了&#xff0c;头发白了&#xff1b;炉火…

8个程序员专用软件/网站,个个是神器,第一个最惊喜......

节省时间的方法有俩&#xff0c;一个是放弃做一些事&#xff0c;在做一些事的时候同步做另一些事。另一种就是改进做一些事的效率&#xff0c;更快地做一些事。寻找更加高效、好用的工具所花费的时间&#xff0c;和这些工具将为你节省的时间相比&#xff0c;九牛一毛。 今天给…

7个管理和优化网站资源的 Python 工具

前一篇&#xff1a;?【清单】6个将 Python 源码编译成软件的构建工具 汇总一些管理、压缩、缩小网站资源的工具在这里供大家各取所需。 1️⃣django-compressor 将链接和内联的 JavaScript 或 CSS 压缩到一个单独的缓存文件中。 它支持 coffeescript&#xff0c;LESS 和 SAS…

ecshop 全系列版本网站漏洞 远程代码执行sql注入漏洞

ecshop漏洞于2018年9月12日被某安全组织披露爆出&#xff0c;该漏洞受影响范围较广&#xff0c;ecshop2.73版本以及目前最新的3.0、3.6、4.0版本都受此次ecshop漏洞的影响&#xff0c;主要漏洞是利用远程代码执行sql注入语句漏洞&#xff0c;导致可以插入sql查询代码以及写入代…

只需几分钟跟小猫学前端(内含视频教程):nodejs基础之用express、ejs、mongdb建设简单的网站...

开门见山视频教程 https://v.qq.com/x/page/d0645s79xrq.html 前 言&#xff1a; 这是小猫的第二篇node教程&#xff0c;第一篇教程是一个简单的试水&#xff0c;小猫的node教程面向对象为没有后端开发经验的但对node有所了解的web前端工程师们&#xff0c;每篇几分钟的视频和博…

与全球程序员过招的 7 个编程挑战网站!

虽说一个程序员能独立完成功能模块的代码&#xff0c;就已经很不错了&#xff01;但是&#xff0c;适当的参加一些竞赛&#xff0c;完成一些编程挑战&#xff0c;也还是很有必要的&#xff01; 下面推荐 7 个能过招全球程序员的编程挑战网站&#xff0c;助你磨练技巧&#xff…

百度收录静态html吗,网站设置伪静态更利于百度收录吗

不要总是觉得百度收录开启伪静态比较好!有很多的站长朋友和seo人员呢?总是觉得百度收录开启伪静态比较好&#xff0c;不开启的话可能对收录的效果不是很好。虽然说官方网站说的是百度收录或者谷歌收录等等&#xff0c;对伪静态都是比较友好的。但是从某个角度去看&#xff0c;…

给 Python 初学者:从零入门 Django 开发网站教程

对于 Python 程序员来说&#xff0c;进行 Web 开发有很多现成的框架可供使用&#xff0c;比如Django、Flask、Tornado。而其中&#xff0c;Django 可能是最全面、同时最受欢迎的一个。世界上最大的在线视频网站 YouTube、最大的图片分享网站 Instagram&#xff0c;都使用 Pytho…

大型网站架构系列:电商网站架构案例(1)(转)

大型网站架构是一个系列文档&#xff0c;欢迎大家关注。本次分享主题&#xff1a;电商网站架构案例。从电商网站的需求&#xff0c;到单机架构&#xff0c;逐步演变为常用的&#xff0c;可供参考的分布式架构的原型。除具备功能需求外&#xff0c;还具备一定的高性能&#xff0…

Flask 项目实战|从零开发“StackOverflow”问答网站

StackOverflow 是全球最大的 IT 技术问答网站之一&#xff0c;在程序员界无人不知无人不晓&#xff0c;堪称“面向搜索引擎编程”神器。下图就是 StackOverflow 网站首页图&#xff1a; 是不是有种似曾相识的感觉&#xff1f;其实国内很多技术问答网站都是仿照 StackOverflow 来…

如何快速压测电商网站?

1.背景 在电商及互联网应用时代&#xff0c;用户和流量已成为应用核心竞争力&#xff0c;而随着数字化营销逐渐走进各个领域&#xff0c;线上的秒杀抢购、热点营销等活动也成为企业的必备营销手段&#xff0c;营销带来的大规模流量浪涌对系统来说是个巨大的考验&#xff0c;如何…

IIS上部署MVC网站,打开后ExtensionlessUrlHandler-Integrated-4.0 实际解决方案

IIS上部署MVC网站&#xff0c;打开后ExtensionlessUrlHandler-Integrated-4.0解决办法 IIS上部署MVC网站&#xff0c;打开后ExtensionlessUrlHandler-Integrated-4.0解决方法 IIS上部署MVC网站&#xff0c;打开后500错误&#xff1a;处理程序“ExtensionlessUrlHandler-Integra…

vs2015网站发布时,设置页面合并后程序集的文件版本

如何将web网站的页面合并成一个新的程序集发布&#xff0c;并设定文件版本&#xff1f; 这个问题我也纠结了很久&#xff0c;问了很多大牛&#xff0c;也没有找到解决方案 曾开了一贴&#xff0c;https://bbs.csdn.net/topics/391027644&#xff0c;后来自己解决了&#xff0c;…

使用GitHub构建个人博客网站

想起来之前搭建个人博客网站的总结还没有写&#xff0c;趁着这几天有时间回头来分享一下。本人的个人博客网站采用的是GitHubjekyll&#xff0c;GitHub托管代码&#xff0c;jekyll发行生成静态网页。 1、购买域名 域名是在一个新加坡的域名服务器商DoDaddy&#xff08;https:…

自学Java比较靠谱的学习Java的视频网站

怎样自学Java&#xff0c;不紧深深苦恼着广大的Java学习者&#xff0c;学习Java的人一般来说有自学和去Java培训机构2个选择&#xff0c;培训机构的好处就是能在短时间内系统地教授你大量知识&#xff0c;至于你能不能接受不管&#xff0c;而且培训机构要缴纳一二万的学费&…

电商网站全链路压测实战

1.背景 在电商及互联网应用时代&#xff0c;用户和流量已成为应用核心竞争力&#xff0c;而随着数字化营销逐渐走进各个领域&#xff0c;线上的秒杀抢购、热点营销等活动也成为企业的必备营销手段&#xff0c;营销带来的大规模流量浪涌对系统来说是个巨大的考验&#xff0c;如…

阿里云MVP课堂:零基础建站,满足你拥有自己网站的心愿

2019独角兽企业重金招聘Python工程师标准>>> 很多人都有一个建站的心&#xff0c;但是由于没有相关的技能&#xff0c;导致最后不了了之。云计算&#xff0c;让一切变得简单起来&#xff0c;零基础也能很快搭建出自己的网站&#xff0c;满足你的心愿。 建站总体来说…

KindEditor 上传漏洞致近百个党政机关网站遭植入

开发四年只会写业务代码&#xff0c;分布式高并发都不会还做程序员&#xff1f; >>> 2月21日消息&#xff0c;近日&#xff0c;安恒明鉴网站安全监测平台和应急响应中心监测发现近百起党政机关网站被植入色情广告页面&#xff0c;分析发现被植入色情广告页面的网站都…

反击黑客之对网站攻击者的IP追踪

ip追踪是一件比较难实现的&#xff0c;因为我只有一个ip&#xff0c;而且在没有任何技术支持下对该ip追踪&#xff0c;同时我在公司也没有服务器权限&#xff0c;仅有后台&#xff0c;一般的ip追踪技术分类&#xff0c;反应式ip追踪&#xff0c;主动式的追踪&#xff0c;分享的…

网站安全之nginx的配置创建访问网站密码认证

最近我们Sinesafe在处理nginxphpmysql架构的客户网站安全方面要配置后台的二级密码访问验证处理过程中要用到nginx的配置来完成这个二级密码的设置安全部署。 下面由我来简要说一下在nginx配置服务中&#xff0c;创建访问网站密码认证的方法。 1&#xff09;需要ngx_http_auth_…