这篇文章我翻译自:https://github.com/JonasCz/How-To-Prevent-Scraping,因为最近在看一些反爬的资料,无意间在 Github 发现这篇文章,我觉得写的很全面,所以想要翻译一下,顺便进行吸收。另外让我觉得非常赞的是这个文章从服务端和前端的角度都做了分析,我们应该从哪些点去做优化,而且每个点都举了例子,有些还给出了注意点。虽然文中有些提到的一些点很基础,也有很多我们目前在业务中也在使用,但是我还是从中吸收到了一些新东西,里面文中外部链接有很多,但是公众号这里不允许外链,所以大家可以点击文末最后的"阅读原文"到 Github 去查看,Github Markdown 的排版可能也比这里更好 : )。
(最后,有些仓促,可能有些注意不到的措别字,还请多多包涵)
提示:这篇文章是我 Stack Overflow 这个问题回答的扩展,我把它整理在 Github 因为它实在是太长了,超过了 Stack Overflow 的字数限制(最多 3 万个字,这文章已经超过 4 万字)
欢迎大家修改、完善还有分享,本文使用 CC-BY-SA 3.0 许可。
不幸的是这挺难的,你需要在防抓和降低真实用户以及搜索引擎的可访问性之间做一下权衡。
为了防爬(也称为网页抓取、屏幕抓取、网站数据挖掘、网站收割或者网站数据获取),了解他们的工作原理很重要,这能防止他们能高效爬取,这个就是这篇文章的主要内容。
通常情况下,抓取程序的目的是为了获取你网站特定的信息,比如文章内容、搜索结果、产品详情还有网站上艺术家或者相册信息。他们爬取这些内容用于维护他们自己的网站(甚至通过你的内容赚钱!),或者制作和你网站不一样的前端界面(比如去做移动 APP),还有一些可能作为个人研究或分析使用。
实际上,有特别多的爬虫类型,而且他们的爬取方式都不太相同:
以上不同的爬虫类型有很多相同点,很多爬虫的行为也很相似,即使他们使用了不同的技术或者方案去爬取你的内容。
这些大多数都是我自己的想法,我在写爬虫时也遇到许多困难,还有一些是来源于网络。
一些常见的检测和防止爬虫的方法:
周期性的检查你的日志,如果发现有异常活动表明是自动爬取(爬虫),类似某一个相同的 IP 很多相同的行为,那你就可以阻止或限制访问。
一些常用的方法:
举个例子,如果某个 IP 请求了你网站很多次,所有的访问都有相同的 UserAgent 、屏幕尺寸(JavaScript 检测),还有全都使用同样的方式和固定的时间间隔点击同一个按钮,那它大概是一个屏幕爬虫;你可以临时限制相似的请求(比如 只限制来自那个 IP 特定 User-Agent 和 屏幕尺寸的请求),这样你不会误伤同样使用这个 IP 的真实用户,比如共享网络链接的用户。
更进一步,当你发现相似的请求,但是来自不同的 IP 地址,表明是分布式爬虫(使用僵尸网络或网络代理的爬虫)。如果你收到类似大量的请求,但是他们来自不同的 IP 地址,你可以拒绝访问。再强调一下,小心不经意限制了真实用户。
这种方法对那种运行 JavaScript 的屏幕爬虫比较有效,因为你可以获得他们大量的信息。
Stack Exchange 上关于 Secruity 的相关问题:
How to uniquely identify users with the same external IP address?
Why do people use IP address bans when IP addresses often change? 关于仅使用 IP 的其他限制
如果可行,要求创建用户才可以查看你的内容。这个可以很好的遏制爬虫,但很容易遏制真实用户:
为了防止爬虫创建大量的用户,你应该:
要求注册用户对用户和搜索引擎来说不友好;如果你要求必须注册才可以看文章,那用户也可能直接离开。
有时爬虫会被运行在云服务商,比如 Amazon Web Services 或 Google App Engine,或者其他 VPS。限制这些来自云服务商的 IP 地址访问你的网站(或出验证码)。你可以可以直接对来自爬取服务的 IP 地址限制访问。
类似的,你也可以限制来自代理或 VPN 的 IP 地址,因为很多爬虫会使用它们来防止被检测到。
但是要知道限制来自代理服务器或 VPN 的 IP,也很容易影响到真实用户。
如果你要封禁或限制访问,你应该确保不要把导致封禁的原因告诉爬虫,他们会根据提示修改自己的爬虫程序。所以下面的这些错误最好不要出现:
想法的,展示一些不包含原因的友好信息会更好,比如下面的信息会更好:
如果真实用户看到这个错误页面,这个对真实用户来说也十分友好。在后续访问中,你也可以考虑展示验证码而不是直接封禁,如果真实用户看到这个错误信息,对于合法用户也会联系你。
验证码(Captcha,“Completely Automated Test to Tell Computers and Humans Apart”)对于防爬十分有效。不幸的是,它也很容易惹恼用户。
因此,如果你发现疑似爬虫,而且想要阻止它的爬取行为,而不是封禁它以免它是真实用户。你可以考虑显示验证码在你再次允许访问之前。
使用验证码的注意事项:
你可以在服务端将文字渲染成图片显示,他将防止简单的爬虫去获取文字内容。
然而,这个对于屏幕阅读器、搜索引擎、性能还有一些其他一些事情都不太好。这个在某些方面也是不违法的(源于访问性问题,eg. the Americans with Disabilities Act),而且对于一些 OCR 爬虫也能非常简单的规避,所以不要采用这种方式。
你也可以用 CSS sprites 做类似的事情,但是也有相同的问题。
如果可以的话,不要让脚本/爬虫能获取你所有的数据。举个例子:你有一个新闻站,有大量的个人文章。你应该确保文章只能通过你自己网站的搜索到,如果你网站不是到处都有你的文章还有链接,那么确保它们只能被搜索功能访问到。这意味着如果一个脚本想要获取你网站的所有文章,就必须通过你站点文章中所有可能的短语去进行搜索,从而获取所有的文章列表,但是这个会非常耗时,而且低效,从而让爬虫放弃。
以下操作会让你完全暴露:
确保你不会暴露你的任何 API,很多时候都是无意间暴露。举个例子,如果你正在使用 AJAX 或 Adobe Flash 的网络请求 或 Java Applet(千万不要用!)来加载你的数据,从这些网络请求中找到要请求的 API 十分简单,比如可以进行反编译然后在爬虫程序中使用这些接口。确保你混淆了你的 API 并且其他人要用它会非常难破解。
由于 HTML 解析器是通过分析页面特定结构去获取内容,我们可以故意修改这些结构来阻止这类爬虫,甚至从根本上他们获取内容。下面大多数做法对其他类型爬虫如搜索引擎蜘蛛、屏幕爬虫也有效。
处理 HTML 的爬虫通过分析特定可识别的部分来处理 HTML。举个例子:如果你所有的页面都有 id 为 article-content 的 div 结构,然后里面有你的文章内容,那要获取你站点所有文章内容是十分简单的,只要解析那个 article-content 那个 div 就可以了,然后有这个结构的爬虫就可以把你的文章随便用在什么地方。
如果你常常修改 HTML 还有你页面的结构, 那这类爬虫就不能一直使用。
本质上来说,就是确保爬虫从相似页面获取想要的内容变得不那么容易。
可以参考这个 PHP 的实现:How to prevent crawlers depending on XPath from getting page contents
这个和前一个类似。如果你根据不同用户的位置/国家(根据 IP 获取)来提供不同的 HTML,这个可能会破坏将站点 HTML 给用户的爬虫。比如,如果有人写了一个移动 APP 来抓取你的站点,一开始可以用,但是对于不同地区的用户就不起作用了,因为他们会获取到不同的 HTML 结构,嵌入式的 HTML 将不不能正常使用。
举个例子:你有一个包含搜索功能的网站, example.com/search?query=somesearchquery 的搜索结果是下面的 HTML 结构:
<div class="search-result">
<h3 class="search-result-title">Stack Overflow has become the world's most popular programming Q & A website</h3>
<p class="search-result-excerpt">The website Stack Overflow has now become the most popular programming Q & A website, with 10 million questions and many users, which...</p>
<a class"search-result-link" href="/stories/stack-overflow-has-become-the-most-popular">Read more</a>
</div>
(And so on, lots more identically structured divs with search results)
你可以猜到这个非常容易爬取:一个爬虫需要做的就只是访问搜索链接,然后从返回的 HTML 分析想要的数据。除了定期修改上面 HTML 的内容,你也可以 保留旧结构的 id 和 class,然后使用 CSS 进行隐藏,并使用假数据进行填充,从而给爬虫投毒 。比如像下面这样:
<div class="the-real-search-result">
<h3 class="the-real-search-result-title">Stack Overflow has become the world's most popular programming Q & A website</h3>
<p class="the-real-search-result-excerpt">The website Stack Overflow has now become the most popular programming Q & A website, with 10 million questions and many users, which...</p>
<a class"the-real-search-result-link" href="/stories/stack-overflow-has-become-the-most-popular">Read more</a>
</div>
<div class="search-result" style="display:none">
<h3 class="search-result-title">Visit example.com now, for all the latest Stack Overflow related news !</h3>
<p class="search-result-excerpt">EXAMPLE.COM IS SO AWESOME, VISIT NOW! (Real users of your site will never see this, only the scrapers will.)</p>
<a class"search-result-link" href="http://example.com/">Visit Now !</a>
</div>
(More real search results follow)
这意味着基于 id 或 class 获取特定数据的爬虫仍然能继续工作,但是他们将会获取假数据甚至广告,而这些数据真实用户是看不到的,因为他们被 CSS 隐藏了。
对上个例子进行补充,你可以在你的 HTML 里面增加不可见的蜜罐数据来抓住爬虫。下面的例子来补充之前说的搜索结果:
<div class="search-result" style="display:none">
<h3 class="search-result-title">This search result is here to prevent scraping</h3>
<p class="search-result-excerpt">If you're a human and see this, please ignore it. If you're a scraper, please click the link below :-)
Note that clicking the link below will block access to this site for 24 hours.</p>
<a class"search-result-link" href="/scrapertrap/scrapertrap.php">I'm a scraper !</a>
</div>
(The actual, real, search results follow.)
一个来获取所有内容的爬虫将会被找到,就像获取其他结果一样,访问链接,查找想要的内容。一个真人将不会看到(因为使用 CSS 隐藏),而且更不会访问这个链接。而正规或者期望的蜘蛛比如谷歌的蜘蛛将不会访问这个链接,因为你可以将 /scrapertrap/ 加入你的 robots.txt 中(不要忘记增加)
你可以让你的 scrapertrap.php 做一些比如限制这个 IP 访问的事情,或者强制这个 IP 之后的请求出验证码。
如果你确定某个访问是爬虫,你可以提供假的或者无用的数据;这将破坏爬虫从你网站获取的数据。你还应该把它和真实数据进行混淆,这样爬虫就不知道他们获取的到底是真的还是假的数据。
举个例子:如果你有一个新闻站,你检测到了一个爬虫,不要去直接封禁它,而是提供假的或者随机生成的文章,那爬虫获取的数据将会被破坏。如果你将假数据和真实的数据进行混淆,那爬虫很难获取到他们想要的真实文章。
很多懒惰的程序员不会在他们的爬虫发请求时带上 UserAgent,而所有的浏览器包括搜索引擎蜘蛛都会携带。
如果请求你时没有携带 UserAgent header 头,你可以展示验证码,或者直接封禁或者限制访问(或者像上面说的提供假数据或者其他的)
这个非常简单去避免,但是作为一种针对书写不当的爬虫,是值得去做的。
很多情况下,爬虫将会使用真实浏览器或搜索引擎爬虫绝对不会使用的 UserAgent,比如:
如果你发现一些爬虫使用真实浏览器或合法蜘蛛绝对不会使用的 UserAgent,你可以将其添加到你的黑名单中。
对上一章节的补充,你也可以检查 [Referer] (https://en.wikipedia.org/wiki/HTTP_referer header) (是的,它是 Referer,而不是 Referrer),一些懒惰的爬虫可能不会携带的这个,或者只是每次都携带一样的(有时候是 “google.com”)。举个例子,如果用户是从站内搜索结果页点击进入文章详情的,那要检查 Referer 这个 header 头是否存在还要看搜索结果页的打点。
注意:
还是,作为一种防止简单爬虫的方法,也值得去实现。
一个真实浏览器(通常)会请求和下载资源比如 CSS 和 图片。HTML 解析器和爬取器可能只关心特定的页面和内容。
你可以基于访问你资源的日志,如果你看到很多请求只请求 HTML,那它可能就是爬虫。
注意搜索引擎蜘蛛、旧的移动设备、屏幕阅读器和设置错误的设备可能也不会请求资源。
访问你网站时,你可以要求 cookie 必须开启。这个能识别没有经验和爬虫新手,然而爬虫要携带 Cookie 也十分简单。如果你要求开启 Cookie,你能使用它们来追踪用户和爬虫的行为,然后基于此来实现频率限制、封禁、或者显示验证码而不仅仅依赖 IP 地址。
举个例子:当用户进行搜索时,设置一个唯一的 Cookie。当搜索结果加载出来之后,验证这个 Cookie。如果一个用户打开了所有的搜索结果(可以从 Cookie 中得知),那很可能就是爬虫
使用 Cookie 可能是低效的,因为爬虫也可以携带 Cookie 发送请求,也可以根据需要丢弃。如果你的网站只能在开启 Cookie 时使用,你也不能给关闭 Cookie 的用户提供服务。
要注意如果你使用 JavaScript 去设置和检测 Cookie,你能封禁那些没有运行 JavaScript 的爬虫,因为它们没办法获取和发送 Cookie。
你可以在页面加载完成之后,使用 JavaScript + AJAX 来加载你的内容。这个对于那些没有运行 JavaScript 的 HTML 分析器来说将无法取得数据。这个对于没有经验或者新手程序员写的爬虫非常有效。
注意:
如果你用 Ajax 和 JavaScript 加载你的数据,在传输的时候要混淆一下。比如,你可以在服务器端 encode 你的数据(比如简单的使用 base64 或 负载一些的多次混淆、位偏移或者是进行加密),然后在客户端在 Ajax 获取数据之后再进行 decode。这意味着如果有人要抓包获取你的请求就不能直接看到你页面如何加载数据,而且那些人也不能直接通过 API 获得你的数据,如果想要获取数据,就必须要去解密你的算法。
下面是一些这个方式的缺点:
比如,CloudFlare 提供反蜘蛛和反爬虫的防御,你只需要直接启用它就可以了,另外 AWS 也提供类似服务。而且 Apache 的 mod_evasive 模块也能让你很轻松地实现频率限制。
你应该直接告诉人们不要抓取你的网站,比如,在你的服务条款中表明。有些人确实会尊重它,而且不在你允许的情况下不会再去抓取数据。
律师们知道如何处理侵犯版权的事情,而且他们可以发送律师函。DMCA(译者注:Digital Millennium Copyright Act,数字千年版权法案,是一个美国版权法律) 也能提供援助。
这看起来适得其反,但是你可以要求标明来源并包含返回你站点的链接。甚至也可以售卖你的 API 而赚取费用。
还有就是,Stack Exchange 提供了 API,但是必须要标明来源。
以我自己写和帮忙别人写爬虫的经验,我认为最有效的方法是:
扩展阅读:
作者:h1z3y3
来源:微信公众号: 360搜索技术团队
出处:https://mp.weixin.qq.com/s?__biz=MzA5ODIxODE2Ng==&mid=2651137205&idx=1&sn=664a46d66f132c96780750d4e9b206eb
"防火墙"这个词大家应该都听说过或者应用过,每个人的电脑、手机几乎都会安装一些的主流的防火墙软件,工作的企事业单位网络里都会安装硬件防火墙。那么这些防火墙能阻挡住黑客的攻击吗?今天我就和大家分享一下这个话题!
一、首先我们需要知道防火墙的原理或者说主要功能
1、什么是防火墙?
官方定义:防火墙也被称为防护墙,它是一种位于内部网络与外部网络之间的网络安全系统,可以将内部网络和外部网络隔离。通常,防火墙可以保护内部/私有局域网免受外部攻击,并防止重要数据泄露。在没有防火墙的情况下,路由器会在内部网络和外部网络之间盲目传递流量且没有过滤机制,而防火墙不仅能够监控流量,还能够阻止未经授权的流量。
简单理解:防火墙是由软件或者软件和硬件组成的系统,它处于安全的网络(通常是内部局域网)和不安全的网络之间,根据由系统管理员设置的访问控制规则,对数据流进行过滤。
2、防火墙基本分类和工作原理
1) 包过滤防火墙
这是第一代防火墙,又称为网络层防火墙,在每一个数据包传送到源主机时都会在网络层进行过滤,对于不合法的数据访问,防火墙会选择阻拦以及丢弃。这 种防火墙的连接可以通过一个网卡即一张网卡由内网的IP地址,又有公网的IP地址和两个网卡一个网卡上有私有网络的IP地址,另一个网卡有外部网络的IP 地址。
第一代防火墙和最基本形式防火墙检查每一个通过的网络包,或者丢弃,或者放行,取决于所建立的一套规则。这称为包过滤防火墙。
本质上,包过滤防火墙是多址的,表明它有两个或两个以上网络适配器或接口。例如,作为防火墙的设备可能有两块网卡(NIC),一块连到内部网络,一块连到公共的Internet。防火墙的任务,就是作为"通信警察",指引包和截住那些有危害的包。
包过滤防火墙检查每一个传入包,查看包中可用的基本信息(源地址和目的地址、端口号、协议等)。然后,将这些信息与设立的规则相比较。如果已经设立了阻断telnet连接,而包的目的端口是23的话,那么该包就会被丢弃。如果允许传入Web连接,而目的端口为80,则包就会被放行。
多个复杂规则的组合也是可行的。如果允许Web连接,但只针对特定的服务器,目的端口和目的地址二者必须与规则相匹配,才可以让该包通过。
最后,可以确定当一个包到达时,如果对该包没有规则被定义,接下来将会发生什么事情了。通常,为了安全起见,与传入规则不匹配的包就被丢弃了。如果有理由让该包通过,就要建立规则来处理它。
建立包过滤防火墙规则的例子如下:
对来自专用网络的包,只允许来自内部地址的包通过,因为其他包包含不正确的包头部信息。这条规则可以防止网络内部的任何人通过欺骗性的源地址发起攻击。而且,如果黑客对专用网络内部的机器具有了不知从何得来的访问权,这种过滤方式可以阻止黑客从网络内部发起攻击。
在公共网络,只允许目的地址为80端口的包通过。这条规则只允许传入的连接为Web连接。这条规则也允许与Web连接使用相同端口的连接,所以它并不是十分安全。
丢弃从公共网络传入的包,而这些包都有你的网络内的源地址,从而减少IP欺骗性的攻击。
丢弃包含源路由信息的包,以减少源路由攻击。要记住,在源路由攻击中,传入的包包含路由信息,它覆盖了包通过网络应采取得正常路由,可能会绕过已有的安全程序。
2) 状态/动态检测防火墙
状态/动态检测防火墙,试图跟踪通过防火墙的网络连接和包,这样防火墙就可以使用一组附加的标准,以确定是否允许和拒绝通信。它是在使用了基本包过滤防火墙的通信上应用一些技术来做到这点的。
当包过滤防火墙见到一个网络包,包是孤立存在的。它没有防火墙所关心的历史或未来。允许和拒绝包的决定完全取决于包自身所包含的信息,如源地址、目的地址、端口号等。包中没有包含任何描述它在信息流中的位置的信息,则该包被认为是无状态的;它仅是存在而已。
一个有状态包检查防火墙跟踪的不仅是包中包含的信息。为了跟踪包的状态,防火墙还记录有用的信息以帮助识别包,例如已有的网络连接、数据的传出请求等。
例如,如果传入的包包含视频数据流,而防火墙可能已经记录了有关信息,是关于位于特定IP地址的应用程序最近向发出包的源地址请求视频信号的信息。如果传入的包是要传给发出请求的相同系统,防火墙进行匹配,包就可以被允许通过。
一个状态/动态检测防火墙可截断所有传入的通信,而允许所有传出的通信。因为防火墙跟踪内部出去的请求,所有按要求传入的数据被允许通过,直到连接被关闭为止。只有未被请求的传入通信被截断。
如果在防火墙内正运行一台服务器,配置就会变得稍微复杂一些,但状态包检查是很有力和适应性的技术。例如,可以将防火墙配置成只允许从特定端口进入的通信,只可传到特定服务器。如果正在运行Web服务器,防火墙只将80端口传入的通信发到指定的Web服务器。
状态/动态检测防火墙可提供的其他一些额外的服务有:
将某些类型的连接重定向到审核服务中去。例如,到专用Web服务器的连接,在Web服务器连接被允许之前,可能被发到SecutID服务器(用一次性口令来使用)。
拒绝携带某些数据的网络通信,如带有附加可执行程序的传入电子消息,或包含ActiveX程序的Web页面。
跟踪连接状态的方式取决于包通过防火墙的类型:
TCP包。当建立起一个TCP连接时,通过的第一个包被标有包的SYN标志。通常情况下,防火墙丢弃所有外部的连接企图,除非已经建立起某条特定规则来处理它们。对内部的连接试图连到外部主机,防火墙注明连接包,允许响应及随后再两个系统之间的包,直到连接结束为止。在这种方式下,传入的包只有在它是响应一个已建立的连接时,才会被允许通过。
UDP包。UDP包比TCP包简单,因为它们不包含任何连接或序列信息。它们只包含源地址、目的地址、校验和携带的数据。这种信息的缺乏使得防火墙确定包的合法性很困难,因为没有打开的连接可利用,以测试传入的包是否应被允许通过。可是,如果防火墙跟踪包的状态,就可以确定。对传入的包,若它所使用的地址和UDP包携带的协议与传出的连接请求匹配,该包就被允许通过。和TCP包一样,没有传入的UDP包会被允许通过,除非它是响应传出的请求或已经建立了指定的规则来处理它。对其他种类的包,情况和UDP包类似。防火墙仔细地跟踪传出的请求,记录下所使用的地址、协议和包的类型,然后对照保存过的信息核对传入的包,以确保这些包是被请求的。
3) 应用程序代理防火墙
应用程序代理防火墙实际上并不允许在它连接的网络之间直接通信。相反,它是接受来自内部网络特定用户应用程序的通信,然后建立于公共网络服务器单独的连接。网络内部的用户不直接与外部的服务器通信,所以服务器不能直接访问内部网的任何一部分。
另外,如果不为特定的应用程序安装代理程序代码,这种服务是不会被支持的,不能建立任何连接。这种建立方式拒绝任何没有明确配置的连接,从而提供了额外的安全性和控制性。
例如,一个用户的Web浏览器可能在80端口,但也经常可能是在1080端口,连接到了内部网络的HTTP代理防火墙。防火墙然后会接受这个连接请求,并把它转到所请求的Web服务器。
这种连接和转移对该用户来说是透明的,因为它完全是由代理防火墙自动处理的。
代理防火墙通常支持的一些常见的应用程序协议有:
HTTP
HTTPS/SSL
SMTP
POP3
IMAP
NNTP
TELNET
FTP
IRC
应用程序代理防火墙可以配置成允许来自内部网络的任何连接,它也可以配置成要求用户认证后才建立连接。要求认证的方式由只为已知的用户建立连接的这种限制,为安全性提供了额外的保证。如果网络受到危害,这个特征使得从内部发动攻击的可能性大大减少。
4) NAT
讨论到防火墙的主题,就一定要提到有一种路由器,尽管从技术上讲它根本不是防火墙。网络地址转换(NAT)协议将内部网络的多个IP地址转换到一个公共地址发到Internet上。
NAT经常用于小型办公室、家庭等网络,多个用户分享单一的IP地址,并为Internet连接提供一些安全机制。
当内部用户与一个公共主机通信时,NAT追踪是哪一个用户作的请求,修改传出的包,这样包就像是来自单一的公共IP地址,然后再打开连接。一旦建立了连接,在内部计算机和Web站点之间来回流动的通信就都是透明的了。
当从公共网络传来一个未经请求的传入连接时,NAT有一套规则来决定如何处理它。如果没有事先定义好的规则,NAT只是简单的丢弃所有未经请求的传入连接,就像包过滤防火墙所做的那样。
可是,就像对包过滤防火墙一样,你可以将NAT配置为接受某些特定端口传来的传入连接,并将它们送到一个特定的主机地址。
5) 个人主机防火墙
现在网络上流传着很多的个人防火墙软件,它是应用程序级的。主机防火墙是一种能够保护个人计算机系统安全的软件,它可以直接在用户的计算机上运行,使用与状态/动态检测防火墙相同的方式,保护一台计算机免受攻击。通常,这些防火墙是安装在计算机网络接口的较低级别上,使得它们可以监视传入传出网卡的所有网络通信。
一旦安装上个人防火墙,就可以把它设置成"学习模式",这样的话,对遇到的每一种新的网络通信,个人防火墙都会提示用户一次,询问如何处理那种通信。然后个人防火墙便记住响应方式,并应用于以后遇到的相同那种网络通信。
例如,如果用户已经安装了一台个人Web服务器,个人防火墙可能将第一个传入的Web连接作上标志,并询问用户是否允许它通过。用户可能允许所有的Web连接、来自某些特定IP地址范围的连接等,个人防火墙然后把这条规则应用于所有传入的Web连接。
基本上,你可以将个人防火墙想象成在用户计算机上建立了一个虚拟网络接口。不再是计算机的操作系统直接通过网卡进行通信,而是以操作系统通过和个人防火墙对话,仔细检查网络通信,然后再通过网卡通信。
6) Web应用防火墙
Web应用防火墙是通过执行一系列针对HTTP/HTTPS的来专门为Web应用提供保护的一款产品,当WEB应用越来越为丰富的同时,WEB 服务器以其强大的计算能力、处理性能及蕴含的较高价值逐渐成为主要攻击目标。SQL注入、网页篡改、网页挂马等安全事件,频繁发生。因此诞生了针对这一些安全隐患的防火墙,与上述防火墙不同,WAF工作在应用层,因此对Web应用防护具有先天的技术优势。基于对Web应用业务和逻辑的深刻理解,WAF对来自Web应用程序客户端的各类请求进行内容检测和验证,确保其安全性与合法性,对非法的请求予以实时阻断,从而对各类网站站点进行有效防护。
主要特点:
WAF不仅仅只是防御Web的http访问,可以对Web应用做到全方位的立体防护。可以防范:
· 常见的命令注入攻击,利用网页漏洞将含有操作系统或软件平台命令注入到网页访问语句中以盗取数据或后端服务器的控制权
· SQL 注入,找到数据查询语句漏洞,通过数据库查询代码窃取或修改数据库中的数据
· 跨站脚本攻击,利用网站漏洞攻击访问该站点的用户,用户登陆或认证信息;
· 各种HTTP 协议攻击,利用http的协议漏洞进行攻击;
· 机器人、 爬虫和扫描,通过机器人,爬虫,和扫描工具自动抓取网站数据以及对网站进行自动攻击;
· 常见的应用程序配置错误 (如 Apache、 IIS 等),利用Web发布程序的配置漏洞或者已知bug进行攻击
主要功能:
①防攻击:功能主要关注Web应用并试图入侵网络服务器的攻击事件过程。可以覆盖OWASP TOP 10、WASC、PCI DSS等标准,包括、、攻击等。
②防漏洞:可对网站中的敏感信息、服务器信息进行屏蔽或伪装,达到避免数据泄露的隐患。成功的攻击往往需要利用服务器的IP、操作系统信息、应用信息、服务器出错信息、数据库出错信息,KS-WAF接管所有返回给客户端的信息,并可中止会话,避免黑客利用敏感信息及服务器信息发动攻击、各类黑客入侵攻击。
③防挂马:随着监管部门的打击力度逐渐加强,挂马攻击的数量越来越少,与此同时,地下逐渐转向了。为了应对这个情况,KS-WAF系统内置了针对当前流行的暗链攻击建立的恶意指纹库,在服务器端已被植入暗链的情况下可准确识别并进行报警,协助管理员清除暗链代码。
④URL检测:通过实现URL级别的,对客户端请求进行检测,如果发现图片、文件等资源信息的来自于其它网站,则阻止请求,节省因盗用资源链接而消耗的带宽和性能。
⑤防爬虫:将爬虫行为分为搜索引擎爬虫及扫描程序爬虫,可屏蔽特定的搜索引擎爬虫节省带宽和性能,也可屏蔽扫描程序爬虫,避免网站被恶意抓取页面。
⑥防挂马:通过检查HTML页面中特征、用户提交数据,查看是否出现、Javascript引用挂马源URL及其他挂马特征以决定是否拦截请求。
⑦抗DDos:支持TCP Flood和HTTP Flood类型的拒绝服务攻击,通过简单有效的方式缓解拒绝服务攻击。
⑨攻击源定位:通过记录攻击者的源IP,进行分析和定位后,通过进行定位展现,帮助运维攻击来源。
7) 下一代防火墙
上面所述的几乎都是传统意义的防火墙,下一代是一款可以全面应对应用层威胁的高性能。通过深入洞察网络流量中的用户、应用和内容,并借助全新的高性能单路径异构并行处理,能够为用户提供有效的应用层一体化安全防护,帮助用户安全地开展业务并简化用户的架构。
下一代防火墙和传统防火墙的区别:
下一代防火墙是一款可以全面应对应用层威胁的高性能防火墙。通过深入洞察网络流量中的用户、应用和内容,并借助全新的高性能单路径异构并行处理引擎,能够为用户提供有效的应用层一体化安全防护,帮助用户安全地开展业务并简化用户的网络安全架构。
传统防火墙功能:具有数据包过滤、网络地址转换(NAT)、协议状态检查以及VPN功能等功能。相对而言,下一代防火墙检测更加细。
下一代防火墙自身属性:
(1) 标准的第一代防火墙功能:具有、(NAT)、协议状态检查以及VPN功能等。
(2) 集成式而非托管式网络入侵防御:支持基于漏洞的签名与基于威胁的签名。IPS与防火墙间的协作所获得的性能要远高于部件的叠加,如:提供推荐防火墙规则,以阻止持续某一载入IPS及有害流量的地址。这就证明,在下一代防火墙中,互相关联作用的是防火墙而非由操作人员在控制台制定与执行各种解决方案。高质量的集成式IPS引擎与签名也是下一代防火墙的主要特性。所谓集成可将诸多特性集合在一起,如:根据针对注入恶意软件网站的IPS检测向防火墙提供推荐阻止的地址。
(3) 业务识别与全栈可视性:采用非端口与协议vs仅端口、协议与服务的方式,识别应用程序并在执行网络安全策略。
(4) 超级智能的防火墙: 可收集防火墙外的各类信息,用于改进阻止决策,或作为优化阻止规则的基础。范例中还包括利用目录集成来强化根据用户身份实施的阻止或根据地址编制黑名单与白名单。
(5) 支持新信息流与新技术的集成路径升级,以应对未来出现的各种威胁。
下一代防火墙工作流程:
数据包入站处理阶段
入站主要完成数据包的接收及L2-L4层的数据包解析过程,并且根据解析结果决定是否需要进入处理流程,否则该数据包就会被丢弃。在这个过程中还会判断是否经过VPN,如果是,则会先进行解密后再做进一步解析。
主引擎处理阶段
主引擎处理大致会经历三个过程:策略匹配及创建会话、应用识别、内容检测。 创建会话信息。当数据包进入主引擎后,首先会进行会话查找,看是否存在该数据包相关的会话。如果存在,则会依据已经设定的策略进行匹配和对应。否则就需要创建会话。具体步骤简述为:进行转发相关的信息查找;而后进行NAT相关的查找;最后进行防火墙的策略查找,检查策略是否允许。如果允许则按照之前的建立对应的会话,如果不允许则丢弃该数据包。
应用识别
数据包进行完初始的防火墙匹配并创建对应会话信息后,会进行应用识别检测和处理,如果该应用为已经可识别的应用,则对此应用进行识别和标记并直接进入下一个处理流程。如果该应用为未识别应用,则需要进行应用识别子流程,对应用进行特征匹配,协议解码,行为分析等处理从而标记该应用。应用标记完成后,会查找对应的应用,如果策略允许则准备下一阶段流程;如果策略不允许,则直接丢弃。
内容检测
主引擎工作的最后一个流程为内容检测流程,主要是需要对数据包进行深层次的协议解码、内容解析、等操作,实现对数据包内容的完全解析;然后通过查找相对应的内容安全策略进行匹配,最后依据安全策略执行诸如:丢弃、报警、记录日志等动作。
数据包出站处理阶段
当数据包经过内容检测模块后,会进入出站处理流程。首先系统会路由等信息查找,然后执行QOS,IP数据包分片的操作,如果该数据走VPN通道的话,还需要通过VPN加密,最后进行数据转发。
与统一策略的关系
统一策略实际上是通过同一套安全策略将处于不同层级的安全模块有效地整合在一起,在策略匹配顺序及层次上实现系统智能匹配,其主要的目的是为了提供更好的。举个例子:有些产品HTTP的检测,URL过滤是通过代理模块做的,而其他协议的是用另外的引擎。 用户必须明白这些模块间的依赖关系,分别做出正确的购置才能达到需要的功能,而统一策略可以有效的解决上述问题。
二、防火墙是否能阻挡住黑客攻击?
答案:是否定的
下面我就说说原由!!!
首先传统防火墙的缺陷:
1.传统防火墙的并发连接数限制容易导致拥塞或者溢出
由于要判断、处理流经防火墙的每一个包,因此防火墙在某些流量大、并发请求多的情况下,很容易导致拥塞,成为整个网络的瓶颈影响性能。而当防火墙溢出的时候,整个防线就如同虚设,原本被禁止的连接也能从容通过了。
2.传统防火墙对服务器合法开放的端口的攻击大多无法阻止
某些情况下,攻击者利用服务器提供的服务进行缺陷攻击。例如利用开放了3389端口取得没打过sp补丁的win2k的超级权限、利用asp程序进行脚本攻击等。由于其行为在防火墙一级看来是"合理"和"合法"的,因此就被简单地放行了。
3.传统防火墙对待内部主动发起连接的攻击一般无法阻止
"外紧内松"是一般局域网络的特点。或许一道严密防守的防火墙内部的网络是一片混乱也有可能。通过社会工程学发送带木马的邮件、带木马的URL等方式,然后由中木马的机器主动对攻击者连接,将铁壁一样的防火墙瞬间破坏掉。另外,防火墙内部各主机间的攻击行为,防火墙也只有如旁观者一样冷视而爱莫能助。
4.传统防火墙不处理病毒
不管是funlove病毒也好,还是CIH也好。在内部网络用户下载外网的带毒文件的时候,防火墙是不为所动的(这里的防火墙不是指单机/企业级的杀毒软件中的实时监控功能,虽然它们不少都叫"病毒防火墙")。
下一代防火墙:
1.可以阻断网络攻击,但不能消灭攻击源。
防火墙能够阻挡一定的网络攻击,但是无法清除攻击源。即使防火墙进行了良好的设置,使得攻击无法穿透防火墙,但各种攻击仍然会源源不断地向防火墙发出尝试。例如接主干网10M网络带宽的某站点,其日常流量中平均有512K左右是攻击行为。那么,即使成功设置了防火墙后,这512K的攻击流量依然不会有丝毫减少。
2.不能抵抗最新的未设置策略的攻击漏洞
就如杀毒软件与病毒一样,总是先出现病毒,杀毒软件经过分析出特征码后加入到病毒库内才能查杀。防火墙的各种策略,也是在该攻击方式经过专家分析后给出其特征进而设置的。如果世界上新发现某个主机漏洞的cracker的把第一个攻击对象选中了您的网络,那么防火墙也没有办法帮到您的。
3.本身也会出现问题和受到攻击
防火墙也是一个os,也有着其硬件系统和软件,因此依然有着漏洞和bug。所以其本身也可能受到攻击和出现软/硬件方面的故障。
4.同样对待内网攻击也是无法完全抵御
介绍了这么多,我相信大家应该也理解了,防火墙是入侵者进入的第一道安全防线,主要解决了经过防火墙的网络传播途径的部分入侵攻击问题,而通过物理传播途径,内网传播途径的攻击就会很难解决,因此本篇文章希望通过我的介绍让大家多了解防火墙这门安全技术和安全知识,提高咱们自身的信息安全意识,任何技术都有漏洞,有了漏洞必然就有机会攻克。所以我们需要拥有掌握技术的同时,更应该提高自身信息安全意识。
比Python,JavaScript才是更适合写爬虫的语言。原因有如下三个方面:
一、任务:爬取用户在Github上的repo信息
通过实例的方式学习爬虫是最好的方法,先定一个小目标:爬取github repo信息。入口URL如下,我们只需要一直点击next按钮就能够遍历到用户的所有repo。
https://github.com/{{username}}?tab=repositories
获取repo之后,可以做什么?
二、爬虫双股剑:axios和jQuery
axios是JavaScript中很常用的异步网络请求库,相比jQuery,它更轻量、更专业。既能够用于浏览器端,也可以用于Node。它的语法风格是promise形式的。在本任务中,只需要了解如下用法就足够了:
axios.get(url).then((resp) => { 请求成功,处理resp.data中的html数据 }).catch((err) => { 请求失败,错误处理 })
请求之后需要处理回复结果,处理回复结果的库当然是用jQuery。实际上,我们有更好的选择:cheerio。
在node下,使用jQuery,需要使用jsdom库模拟一个window对象,这种方法效率较低,四个字形容就是:笨重稳妥。
如下代码使用jQuery解析haha.html文件
fs = require("fs") jquery=require('jquery') jsdom=require('jsdom') //fs.readFileSync()返回结果是一个buffer,相当于byte[] html = fs.readFileSync('haha.html').toString('utf8') dom= new jsdom.JSDOM(html) $=jquery(dom.window) console.log($('h1'))
cheerio只实现了jQuery中的DOM部分,相当于jQuery的一个子集。cheerio的语法和jQuery完全一致,在使用cheerio时,几乎感觉不到它和jQuery的差异。在解析HTML方面,毫无疑问,cheerio是更好的选择。如下代码使用cheerio解析haha.html文件。
cheerio=require('cheerio') html=require('fs').readFileSync("haha.html").toString('utf8') $=cheerio.load(html) console.log($('h1'))
只需20余行,便可实现简单的github爬虫,此爬虫只爬取了一页repo列表。
var axios = require("axios") var cheerio = require("cheerio") axios.get("https://github.com/weiyinfu?tab=repositories").then(resp => { var $ = cheerio.load(resp.data) var lis = $("#user-repositories-list li") var repos = [] for (var i = 0; i < lis.length; i++) { var li = lis.eq(i) var repo = { repoName: li.find("h3").text().trim(), repoUrl: li.find("h3 a").attr("href").trim(), repoDesc: li.find("p").text().trim(), language: li.find("[itemprop=programmingLanguage]").text().trim(), star: li.find(".muted-link.mr-3").eq(0).text().trim(), fork: li.find(".muted-link.mr-3").eq(1).text().trim(), forkedFrom: li.find(".f6.text-gray.mb-1 a").text().trim() } repos.push(repo) } console.log(repos) })
三、更丰富的功能
爬虫不是目的,而是达成目的的一种手段。获取数据也不是目的,从数据中提取统计信息并呈现给人才是最终目的。
在github爬虫的基础上,我们可以扩展出更加丰富的功能:使用echarts等图表展示结果。
要想让更多人使用此爬虫工具获取自己的github统计信息,就需要将做成一个网站的形式,通过搜索页面输入用户名,启动爬虫立即爬取github信息,然后使用echarts进行统计展示。网站肯定也要用js作为后端,这样才能和js爬虫无缝衔接,不然还要考虑跨语言调用。js后端有两大web框架express和koa,二者API非常相似,并无优劣之分,但express更加流行。
如上设计有一处用户体验不佳的地方:当启动爬虫爬取github信息时,用户可能需要等待好几秒,这个过程不能让用户干等着。一种解决思路是:让用户看到爬虫爬取的进度或者爬取过程。可以通过websocket向用户推送爬取过程信息并在前端进行展示。展示时,使用类似控制台的界面进行展示。
如何存储爬取到的数据呢?使用MongoDB或者文件都可以,最好实现两种存储方式,让系统的存储方式变得可配置。使用MongoDB时,用到js中的连接池框架generic-pool。
整个项目用到的库包括:
试用地址:
https://weiyinfu.cn/githubstatistic/search.html
案例地址:https://github.com/weiyinfu/GithubStatistic
原文链接:https://zhuanlan.zhihu.com/p/53763115
*请认真填写需求信息,我们会在24小时内与您取得联系。