<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>潘锦的空间 &#187; 安全</title>
	<atom:link href="https://www.phppan.com/tag/%e5%ae%89%e5%85%a8/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.phppan.com</link>
	<description>SaaS SaaS架构 团队管理 技术管理 技术架构 PHP 内核 扩展 项目管理</description>
	<lastBuildDate>Sat, 25 Apr 2026 00:56:17 +0000</lastBuildDate>
	<language>zh-CN</language>
		<sy:updatePeriod>hourly</sy:updatePeriod>
		<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=3.9.40</generator>
	<item>
		<title>海量「免费」的 OPENAI KEY，你敢用吗？</title>
		<link>https://www.phppan.com/2025/07/free-openai-key/</link>
		<comments>https://www.phppan.com/2025/07/free-openai-key/#comments</comments>
		<pubDate>Sat, 05 Jul 2025 14:23:10 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[架构和远方]]></category>
		<category><![CDATA[OpenAI]]></category>
		<category><![CDATA[安全]]></category>

		<guid isPermaLink="false">https://www.phppan.com/?p=2392</guid>
		<description><![CDATA[技术群在传一张 X 上发的一个截图，是这样的： 过去:如果你没有 windows 激活码，怎么办?去网上搜一个 [&#8230;]]]></description>
				<content:encoded><![CDATA[<div>
<div>
<p>技术群在传一张 X 上发的一个截图，是这样的：</p>
<p><img class="medium-zoom-image" src="https://p9-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/3158ed78142549b2b98f06ecb7af2c30~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg5r2Y6ZSm:q75.awebp?rk3s=f64ab15b&amp;x-expires=1752329619&amp;x-signature=rHLoVfXFR2gnzYN9LvNw9qjb%2BuU%3D" alt="" /></p>
<blockquote><p>过去:如果你没有 windows 激活码，怎么办?去网上搜一个</p>
<p>现在:如果你没有 OPENAIAPIKEY，怎么办，答案仍然是去 Github 上搜一搜</p>
<p>(警告，不推荐这种行为，发帖的目的是告诉大家不要把环境变量扔到repo里,否则等着被用炸吧&#8230;.)</p></blockquote>
<p>我自己去搜了一下，多加了点匹配，如图：</p>
<p><img class="medium-zoom-image" src="https://p9-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/07f19d79da1b4bb6ac8d5d3f60ea2803~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg5r2Y6ZSm:q75.awebp?rk3s=f64ab15b&amp;x-expires=1752329619&amp;x-signature=a31aJzGNY7465EVlVmtBVNmngSo%3D" alt="" /></p>
<p>在 GitHub 上搜索 &#8220;OPENAI KEY=sk-&#8221;，你能找到超过 2.5K 的代码记录。是的，是 2500+ 条。</p>
<p>如果有人拿到这些 KEY 去使用了，刚好有 KEY 可以使用，那对于 KEY 的主人来说，无疑是一个巨坑，一天可能超多的钱就没有了，有个好消息是 OpenAI 有消费上限保护。</p>
<p>这些 KEY 里，有多少是真正可用的？又有多少是已经被销毁的？更重要的是，你真的敢用吗？</p>
<h2 data-id="heading-0">为什么会发生这种事？</h2>
<p>说到底，这是一个老生常谈却又屡禁不止的问题。</p>
<p>我们喜欢一切能让工作变得简单的方法。把 API KEY 直接写在代码里，确实很方便：</p>
<ul>
<li>不用每次都去环境变量里配置</li>
<li>团队成员 clone 下来就能跑</li>
<li>部署的时候也省事儿</li>
</ul>
<p>但是，代价往往是昂贵的。</p>
<p>更深一些的原因是，很多开发者对安全的认知还停留在「我的仓库是私有的」或者「谁会那么无聊来翻我的代码」这种侥幸心理上。殊不知，GitHub 上有大量的自动化机器人，24 小时不间断地扫描新提交的代码，专门寻找各种敏感信息。</p>
<p>另外一个是认知偏差：</p>
<ul>
<li>**临时变永久：「**先这样写，回头再改」——程序员最大的谎言之一。临时方案有一种神奇的特性，就是会变成永久方案。今天的 quick fix，明天就是 production code。</li>
<li>**版本控制的特性理解不足：**很多新手不知道，Git 会永久记录所有历史。即使你删除了包含密钥的文件，它依然存在于 Git 历史中。除非你重写整个历史（force push），否则密钥会一直在那里。</li>
<li>**公开的定义理解有误：**有人以为&#8221;不宣传就等于不公开&#8221;。但在互联网上，只要能被访问到，就等于向全世界公开。你不说，不代表爬虫不知道。</li>
</ul>
<h2 data-id="heading-1">不只是 API KEY</h2>
<p>在这个图的下面，有大佬回复了，曾经翻墙的代理也在这里找到过。扩展开来，用同样的方法，你能在 GitHub 上找到：</p>
<ul>
<li>数据库的账号密码</li>
<li>服务器的 SSH 密钥</li>
<li>各种云服务的 Access Key</li>
<li>邮箱的 SMTP 配置</li>
<li>支付接口的密钥</li>
<li>甚至是公司内网的 VPN 账号</li>
</ul>
<p>这就像是把家里的钥匙随手扔在大街上，还在上面贴了张纸条写着你家地址。</p>
<h2 data-id="heading-2">那些血淋淋的教训</h2>
<p>说几个真实的案例，都是业内的血泪史。</p>
<p><strong>案例一：Uber 的 5700 万用户数据泄露</strong></p>
<p>2016 年，Uber 因为工程师将 AWS 密钥上传到 GitHub，导致黑客获取了 5700 万用户的个人信息。最后 Uber 不得不支付 10 万美元的&#8221;封口费&#8221;，试图掩盖这次事故。结果呢？不仅钱白花了，后来还是被曝光，额外付出了巨额罚款。</p>
<p><strong>案例二：2025年 xAI（马斯克旗下AI公司）API 密钥泄露</strong></p>
<p>xAI 开发者在公开 GitHub 仓库提交了包含 <strong>私有 API 密钥</strong> 的配置文件（<code>.env</code>），该密钥可访问 SpaceX、特斯拉及 Twitter/X 的定制化大语言模型（LLM）</p>
<p>。泄露内容包括：</p>
<ul>
<li>未发布的 <strong>Grok-2.5V</strong> 等核心模型开发版本；</li>
<li>至少 <strong>60 个私有数据集</strong>，涉及内部运营数据。</li>
</ul>
<p><strong>影响</strong>：</p>
<ul>
<li>密钥持续暴露 <strong>近两个月</strong>（2025年3月2日–4月30日），期间未被及时停用；</li>
<li>攻击者可能窃取未发布模型、滥用内部基础设施或发起供应链攻击；</li>
<li>xAI 被迫删除涉事仓库，但未公开回应事件细节。</li>
</ul>
<p><strong>案例三：加密货币被盗空</strong></p>
<p>这个更刺激。Web3 流媒体应用 Unlonely 的联合创始人 Brian Guan 错误的在 GitHub 上公开了一个包含其钱包私钥的存储库，导致该钱包在 2 分钟内即被盗空，损失了 4 万美元</p>
<h2 data-id="heading-3">那么，如何规避呢？</h2>
<p>好了，聊完曾经的坑，咱们来说点实际的——怎么避免这种悲剧发生在自己身上。</p>
<h3 data-id="heading-4">1. 意识层面</h3>
<p>首先得明白一个道理：<strong>任何敏感信息都不应该出现在代码里</strong>。</p>
<p>这就像你不会把银行卡密码写在卡背面一样。哪怕是测试环境的密钥，也不应该直接写在代码里。因为你永远不知道什么时候会手滑把代码推到公开仓库。</p>
<h3 data-id="heading-5">2. 上点技术手段</h3>
<p><strong>使用环境变量</strong></p>
<p>这是最基本的做法。把所有的敏感配置都放到环境变量里：</p>
<div class="code-block-extension-header">
<div class="code-block-extension-headerLeft">
<div class="code-block-extension-foldBtn"></div>
<p><span class="code-block-extension-lang">python</span></div>
<div class="code-block-extension-headerRight">
<div class="code-tips" data-v-4fdcfe21=""><span data-v-4fdcfe21="">体验AI代码助手</span></div>
<div class="render" data-v-159ebe90=""><span class="txt" data-v-159ebe90="">代码解读</span></div>
<div class="code-block-extension-copyCodeBtn">复制代码</div>
</div>
</div>
<pre><code class="hljs language-python code-block-extension-codeShowNum" lang="python"><span class="code-block-extension-codeLine" data-line-num="1"><span class="hljs-keyword">import</span> os</span>
<span class="code-block-extension-codeLine" data-line-num="2">openai_key = os.getenv(<span class="hljs-string">'OPENAI_API_KEY'</span>)</span>

</code></pre>
<p><strong>使用配置文件 + .gitignore</strong></p>
<p>创建一个 <code>config.example.json</code>，里面是配置模板：</p>
<div class="code-block-extension-header">
<div class="code-block-extension-headerLeft">
<div class="code-block-extension-foldBtn"></div>
<p><span class="code-block-extension-lang">json</span></div>
<div class="code-block-extension-headerRight">
<div class="code-tips" data-v-4fdcfe21=""><span data-v-4fdcfe21="">体验AI代码助手</span></div>
<div class="render" data-v-159ebe90=""><span class="txt" data-v-159ebe90="">代码解读</span></div>
<div class="code-block-extension-copyCodeBtn">复制代码</div>
</div>
</div>
<pre><code class="hljs language-json code-block-extension-codeShowNum" lang="json"><span class="code-block-extension-codeLine" data-line-num="1"><span class="hljs-punctuation">{</span></span>
<span class="code-block-extension-codeLine" data-line-num="2">  <span class="hljs-attr">"openai_key"</span><span class="hljs-punctuation">:</span> <span class="hljs-string">"your-key-here"</span><span class="hljs-punctuation">,</span></span>
<span class="code-block-extension-codeLine" data-line-num="3">  <span class="hljs-attr">"database_url"</span><span class="hljs-punctuation">:</span> <span class="hljs-string">"your-database-url"</span></span>
<span class="code-block-extension-codeLine" data-line-num="4"><span class="hljs-punctuation">}</span></span>

</code></pre>
<p>实际使用的 <code>config.json</code> 加入 <code>.gitignore</code>，这样就不会被提交到仓库。</p>
<p><strong>使用密钥管理服务</strong></p>
<p>对于正式的项目，建议使用专门的密钥管理服务：</p>
<ul>
<li>AWS Secrets Manager</li>
<li>Azure Key Vault</li>
<li>HashiCorp Vault</li>
<li>或者自建的密钥管理系统</li>
<li>或者使用配置管理系统</li>
</ul>
<h4 data-id="heading-6">3. 流程和工具保障</h4>
<p><strong>Git Hooks</strong></p>
<p>在 <code>.git/hooks/pre-commit</code> 里添加检查脚本，自动扫描即将提交的代码中是否包含敏感信息。市面上有很多现成的工具，比如 git-secrets。</p>
<p><strong>代码审查</strong></p>
<p>建立 Code Review 机制，特别关注配置相关的改动。人工审查虽然可能遗漏，但多一道关卡总是好的。</p>
<p><strong>定期扫描</strong></p>
<p>使用工具定期扫描你的代码仓库：</p>
<ul>
<li>TruffleHog：可以扫描整个 git 历史</li>
<li>GitGuardian：提供实时监控</li>
<li>GitHub 自带的 Secret Scanning</li>
</ul>
<h4 data-id="heading-7">4. 应急响应机制</h4>
<p>即使做了万全准备，意外还是可能发生。所以你需要：</p>
<p><strong>快速撤销机制</strong></p>
<ul>
<li>知道如何快速撤销泄露的密钥</li>
<li>准备好备用密钥，可以快速切换</li>
</ul>
<p><strong>监控告警</strong></p>
<ul>
<li>设置异常使用告警</li>
<li>关注账单变化</li>
</ul>
<p><strong>定期轮换</strong></p>
<ul>
<li>即使没有泄露，也要定期更换密钥</li>
<li>就像定期换密码一样</li>
</ul>
<h2 data-id="heading-8">本质是什么问题？</h2>
<p>说了这么多，我们来思考一个更深层的问题：为什么这种低级错误会一再发生？</p>
<p>我觉得本质上是<strong>便利性与安全性的永恒矛盾</strong>。</p>
<p>作为开发者，我们总是在寻找更高效的工作方式。把密钥写在代码里确实方便，但这种方便是以安全为代价的。这就像是为了省事不锁门，虽然进出方便了，但家里的东西也不安全了。</p>
<p>另一个层面是<strong>安全意识的缺失</strong>。很多开发者，特别是刚入行的新人，对安全问题的严重性认识不足。他们可能觉得「我就是个小透明，谁会盯上我」，但实际上，自动化的扫描工具可不管你是谁。</p>
<p>还有就是<strong>团队管理的问题</strong>。很多团队没有建立起完善的安全规范和流程，全凭开发者的自觉。这就像是期望每个人都自觉遵守交通规则，没有红绿灯和交警，结果可想而知。</p>
<h2 data-id="heading-9">写在最后</h2>
<p>回到开头的问题——「海量免费的 OpenAI KEY，你敢用吗？」</p>
<p>我的答案是：还是不用的好。</p>
<p>这些所谓的「免费」密钥，背后可能是某个开发者的血汗钱，是某个创业公司的生死存亡。使用这些泄露的密钥，不仅是不道德的，更可能让我们卷入法律纠纷。</p>
<p>更重要的是，如果我们真的在做正经项目，这些来路不明的密钥随时可能失效，会让我们的服务变得极不稳定。与其贪这点小便宜，不如老老实实申请自己的密钥，至少睡得安稳。</p>
<p>最后想说的是，安全无小事。今天你可能觉得泄露个 API KEY 没什么大不了，明天可能就是整个数据库被端了。在这个数据就是金钱的时代，保护好自己的数字资产，就是保护好自己的钱包。</p>
<p>别让你的代码仓库成为黑客的 ATM 机。</p>
<p>记住：<strong>GitHub 不是你的密码本，代码仓库不是保险箱</strong>。</p>
<p>如果这篇文章让你想起了什么，赶紧去检查一下你的代码仓库吧。说不定，你的密钥正在某个角落里呆着呢。</p>
<p>以上。</p>
</div>
<div>作者：潘锦<br />
链接：https://juejin.cn/post/7523134315641045043<br />
来源：稀土掘金<br />
著作权归作者所有。商业转载请联系作者获得授权，非商业转载请注明出处。</div>
</div>
]]></content:encoded>
			<wfw:commentRss>https://www.phppan.com/2025/07/free-openai-key/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>架构师必备：MFA 了解一下</title>
		<link>https://www.phppan.com/2024/12/architect-must-know-mfa-introduction/</link>
		<comments>https://www.phppan.com/2024/12/architect-must-know-mfa-introduction/#comments</comments>
		<pubDate>Sat, 07 Dec 2024 01:34:28 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[架构和远方]]></category>
		<category><![CDATA[MFA]]></category>
		<category><![CDATA[安全]]></category>
		<category><![CDATA[安全架构]]></category>
		<category><![CDATA[架构师]]></category>

		<guid isPermaLink="false">http://www.phppan.com/?p=2304</guid>
		<description><![CDATA[1. 引言 还记得 2023 年 GitHub 强制推行多因子认证（MFA）的那一刻吗？从 3 月开始，Git [&#8230;]]]></description>
				<content:encoded><![CDATA[<h1 style="color: #000000;" data-tool="mdnice编辑器"><span style="font-weight: bold; color: #0e8aeb;">1. 引言</span></h1>
<p style="color: #000000;" data-tool="mdnice编辑器">还记得 2023 年 GitHub 强制推行多因子认证（MFA）的那一刻吗？从 3 月开始，GitHub 分阶段要求用户启用 MFA，并在年底前全面完成覆盖，这让全球开发者不得不重新审视身份安全的重要性。</p>
<p style="color: #000000;" data-tool="mdnice编辑器">现在我们登录 Github ，除了要输入密码，还需要完成一个额外的验证步骤，比如输入手机上的动态验证码，或者通过手机上的身份验证器（Authenticator App）确认登录。这种看似繁琐的体验已经成为各大云厂商产品的标配。不仅是 GitHub，像 AWS、阿里云、腾讯云等云厂商也几乎都要求在敏感操作时使用多因子认证（MFA），以确保账户安全。</p>
<p style="color: #000000;" data-tool="mdnice编辑器">这种举措不仅保护了平台上的代码和账户安全，更体现了现代身份管理技术的趋势，今天，我们就从 GitHub 强制 MFA 的案例切入，了解 MFA 及 Google Authenticator 的实现原理。</p>
<h1 style="color: #000000;" data-tool="mdnice编辑器"><span style="font-weight: bold; color: #0e8aeb;">2. 什么是 MFA/2FA</span></h1>
<p style="color: #000000;" data-tool="mdnice编辑器">在探讨 MFA 之前，我们需要理解身份验证的本质。<strong style="color: #0e88eb;">身份验证</strong>是确认某人或某物的身份是否属实的过程。无论是通过密码登录 Gmail，还是刷身份证进入火车站，身份验证的核心都是确保「你是你自称的那个人」。</p>
<p style="color: #000000;" data-tool="mdnice编辑器">然而，传统的基于密码的身份验证模式存在诸多隐患：</p>
<ul class="list-paddingleft-1" style="color: #000000;">
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">密码过于简单</strong>：许多人使用诸如“123456”或“password”这样的弱密码。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">密码重复使用</strong>：用户往往将同一个密码应用于多个网站，一旦一个账户泄露，其它账户也岌岌可危。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">钓鱼攻击和暴力破解</strong>：黑客通过欺骗或技术手段轻易获取用户密码。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">中间人攻击</strong>：在不安全的网络环境中，密码可能被拦截。</section>
</li>
</ul>
<p style="color: #000000;" data-tool="mdnice编辑器">这些问题导致密码的安全性备受质疑，因此需要额外的保护层，MFA 由此应运而生。</p>
<h2 style="color: #000000;" data-tool="mdnice编辑器"><span style="font-weight: bold; color: #0e8aeb;">2.1 MFA：不是多一个步骤，而是多一层防护</span></h2>
<p style="color: #000000;" data-tool="mdnice编辑器">MFA，Multi-Factor Authentication，多因子认证，是一种身份验证方法，要求用户提供多个独立的身份验证因素来完成登录或访问。传统的身份认证只依赖单一密码，MFA 则通过引入额外的验证步骤，极大地提升了账户安全性。</p>
<p style="color: #000000;" data-tool="mdnice编辑器">在 MFA 中，通常会结合以下三类验证因素：</p>
<ul class="list-paddingleft-1" style="color: #000000;">
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">你知道的东西</strong>：密码、PIN 码、答案问题等。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">你拥有的东西</strong>：动态验证码（通过手机或硬件设备生成）、安全令牌、智能卡、U 盾等。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">你自身的特征</strong>：生物特征验证，如指纹、面部识别、虹膜扫描等。</section>
</li>
</ul>
<p style="color: #000000;" data-tool="mdnice编辑器"><strong style="color: #0e88eb;">MFA 的意义</strong>在于，即便攻击者获得了你的密码，由于缺少额外的验证因素，他们依然无法轻易访问你的账户。例如，登录 GitHub 时，即使密码被泄露，攻击者若没有你的手机或安全密钥，仍然无法完成登录。</p>
<p style="color: #000000;" data-tool="mdnice编辑器">毕竟，密码泄露已经成为网络攻击中最常见的手段，而 MFA 则为用户的账户增加了第二道甚至第三道锁。</p>
<h2 style="color: #000000;" data-tool="mdnice编辑器"><span style="font-weight: bold; color: #0e8aeb;">2.2 2FA</span></h2>
<p style="color: #000000;" data-tool="mdnice编辑器"><strong style="color: #0e88eb;">2FA</strong> 是<strong style="color: #0e88eb;">MFA</strong> 的一种特殊形式，它仅使用<strong style="color: #0e88eb;">两种不同的验证因素</strong>来完成认证。简单来说，2FA 是 MFA 的一个子集。</p>
<p style="color: #000000;" data-tool="mdnice编辑器">例如：</p>
<ul class="list-paddingleft-1" style="color: #000000;">
<li>
<section style="color: #010101;">登录时输入密码（第一个验证因素：你知道的东西）。</section>
</li>
<li>
<section style="color: #010101;">然后输入手机上的动态验证码（第二个验证因素：你拥有的东西）。</section>
</li>
</ul>
<p style="color: #000000;" data-tool="mdnice编辑器">值得注意的是，两种不同的验证因素是<strong style="color: #0e88eb;">类别的不同</strong>，像以前有一种策略是需要提供密码和安全问题答案，这是单因素身份验证，因为这两者都与「你知道的东西」这个因素有关。</p>
<p style="color: #000000;" data-tool="mdnice编辑器">在大多数应用中，2FA 已经足够满足安全需求，因此它是目前最常见的多因子认证实现方式。</p>
<h1 style="color: #000000;" data-tool="mdnice编辑器"><span style="font-weight: bold; color: #0e8aeb;">3. 为什么 MFA 如此重要？</span></h1>
<h2 style="color: #000000;" data-tool="mdnice编辑器"><span style="font-weight: bold; color: #0e8aeb;">1. 密码不再安全</span></h2>
<p style="color: #000000;" data-tool="mdnice编辑器">随着技术的进步，密码破解的门槛越来越低。攻击者可以通过以下方式轻松破解密码：</p>
<ul class="list-paddingleft-1" style="color: #000000;">
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">暴力破解</strong>：通过快速尝试各种可能的密码组合。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">数据泄露</strong>：黑客通过暗网购买被泄露的用户名和密码。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">钓鱼攻击</strong>：通过伪装成合法网站诱骗用户输入密码。</section>
</li>
</ul>
<p style="color: #000000;" data-tool="mdnice编辑器">在这种背景下，仅靠密码保护账户变得极为不可靠。MFA 通过引入多层保护，从根本上提升了安全性。</p>
<h2 style="color: #000000;" data-tool="mdnice编辑器"><span style="font-weight: bold; color: #0e8aeb;">2. 提高攻击成本</span></h2>
<p style="color: #000000;" data-tool="mdnice编辑器">MFA 的最大优势在于，它大幅提高了攻击者的攻击成本。例如，攻击者即便成功窃取了用户密码，也需要物理接触用户的手机或破解生物特征才能完成登录。这种额外的复杂性往往会使攻击者放弃目标。</p>
<h2 style="color: #000000;" data-tool="mdnice编辑器"><span style="font-weight: bold; color: #0e8aeb;">3. 应对多样化的威胁</span></h2>
<p style="color: #000000;" data-tool="mdnice编辑器">MFA 可以有效抵御多种网络威胁，包括：</p>
<ul class="list-paddingleft-1" style="color: #000000;">
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">凭证填充攻击</strong>：即使用泄露的密码尝试登录多个账户。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">中间人攻击</strong>：即便密码在传输中被窃取，攻击者仍需第二个验证因素。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">恶意软件</strong>：即使恶意软件记录了用户输入的密码，也无法破解动态验证码。</section>
</li>
</ul>
<h1 style="color: #000000;" data-tool="mdnice编辑器"><span style="font-weight: bold; color: #0e8aeb;">4. MFA/2FA 的工作过程和形式</span></h1>
<h2 style="color: #000000;" data-tool="mdnice编辑器"><span style="font-weight: bold; color: #0e8aeb;">4.1 MFA 验证的形式</span></h2>
<p style="color: #000000;" data-tool="mdnice编辑器">MFA 形式多样，主要有如下的一些形式：</p>
<ol class="list-paddingleft-1" style="color: #000000;">
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">基于短信的验证</strong>：用户在输入密码后，会收到一条包含验证码的短信。虽然方便，但短信验证并非绝对安全，因为短信可能被拦截或通过 SIM 卡交换攻击（SIM Swapping）被窃取。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">基于 TOTP（时间同步一次性密码）的验证</strong>：像 Google Authenticator 这样的应用程序可以生成基于时间的动态密码。这种方式更安全，因为动态密码仅在短时间内有效，且无需网络传输。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">硬件令牌</strong>：硬件令牌是专门生成动态密码的物理设备。例如银行常用的 USB 令牌，用户需要插入电脑才能完成验证。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">生物特征验证</strong>：指纹、面部识别和视网膜扫描是最常见的生物特征验证方式。这种验证方式非常直观，但存在用户数据隐私的争议。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">基于位置的验证</strong>：通过 GPS 或 IP 地址限制用户只能在特定位置登录。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">基于行为的验证</strong>：通过分析用户的打字节奏、鼠标移动轨迹等行为特征来确认身份。</section>
</li>
</ol>
<h2 style="color: #000000;" data-tool="mdnice编辑器"><span style="font-weight: bold; color: #0e8aeb;">4.2 2FA 如何工作？</span></h2>
<p style="color: #000000;" data-tool="mdnice编辑器">双因素身份验证的核心理念是：即使攻击者获得了用户的密码，他仍然需要通过第二道验证关卡才能访问账户。以下是 2FA 的典型工作流程：</p>
<ol class="list-paddingleft-1" style="color: #000000;">
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">第一道验证：用户输入用户名和密码</strong>：用户通过密码证明「知道的内容」，这是第一道验证因素。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">第二道验证：动态代码或生物特征识别</strong>：系统会向用户发送一个一次性验证码（如短信、电子邮件或 Google Authenticator 生成的代码），或者要求用户提供指纹或面部识别。这是「拥有的东西」或「自身的特征」的验证。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">验证成功，授予访问</strong>：如果两道验证都通过，用户即可成功登录。</section>
</li>
</ol>
<p style="color: #000000;" data-tool="mdnice编辑器">如当你登录阿里云时，输入密码后需要打开阿里云的 APP，输入 MFA 的验证码。</p>
<h1 style="color: #000000;" data-tool="mdnice编辑器"><span style="font-weight: bold; color: #0e8aeb;">5. MFA 的局限性</span></h1>
<p style="color: #000000;" data-tool="mdnice编辑器">尽管 MFA 极大地提高了账户安全性，但它并非万能。有如下的一些局限性：</p>
<ol class="list-paddingleft-1" style="color: #000000;">
<li>
<section style="color: #010101;">
<p style="color: #000000;"><strong style="color: #0e88eb;">用户体验问题</strong>：对于技术不熟练的用户来说，设置和使用 MFA 应用程序门槛比较高。此外，每次登录需要额外的验证步骤，也可能降低用户体验。</p>
</section>
</li>
<li>
<section style="color: #010101;">
<p style="color: #000000;"><strong style="color: #0e88eb;">成本问题</strong>：企业需要支付额外的费用来实施 MFA。例如短信验证需要支付短信发送费用，而硬件令牌的采购和分发也需要额外开支。</p>
</section>
</li>
<li>
<section style="color: #010101;">
<p style="color: #000000;"><strong style="color: #0e88eb;">并非百分百安全</strong>：MFA 虽然有效，但并非无懈可击。例如：</p>
</section>
<ul class="list-paddingleft-1">
<li>
<section style="color: #010101;">短信验证可能被攻击者通过 SIM 卡交换攻击破解。</section>
</li>
<li>
<section style="color: #010101;">恶意软件可能会窃取动态密码。</section>
</li>
<li>
<section style="color: #010101;">高级攻击者甚至可能通过社会工程学手段获取验证码。</section>
</li>
</ul>
</li>
</ol>
<p style="color: #000000;" data-tool="mdnice编辑器">在了解了概念后，我们看一下我们常用的一个 MFA 验证应用 Google Authenticator 的实现原理。</p>
<h1 style="color: #000000;" data-tool="mdnice编辑器"><span style="font-weight: bold; color: #0e8aeb;">6. Google Authenticator 的实现原理</span></h1>
<p style="color: #000000;" data-tool="mdnice编辑器">在使用 Google Authenticator 进行 2FA 的过程中，验证的过程可以分为以下两个主要阶段：<strong style="color: #0e88eb;">初始化阶段</strong> 和<strong style="color: #0e88eb;">验证阶段</strong>。</p>
<h2 style="color: #000000;" data-tool="mdnice编辑器"><span style="font-weight: bold; color: #0e8aeb;">6.1 初始化阶段：共享密钥生成与分发</span></h2>
<p style="color: #000000;" data-tool="mdnice编辑器">这是用户首次启用双因素身份验证时发生的过程。在此阶段，服务端生成共享密钥（Secret Key）并通过安全的方式分发给用户的 Google Authenticator 应用。</p>
<ol class="list-paddingleft-1" style="color: #000000;">
<li>
<section style="color: #010101;">
<p style="color: #000000;"><strong style="color: #0e88eb;">服务端生成共享密钥</strong>：</p>
</section>
<ul class="list-paddingleft-1">
<li>
<section style="color: #010101;">服务端为用户生成一个随机的共享密钥<code style="color: #0e8aeb;">K</code>（通常是 16~32 个字符的 Base32 编码字符串，例如<code style="color: #0e8aeb;">JBSWY3DPEHPK3PXP</code>）。</section>
</li>
<li>
<section style="color: #010101;">该密钥会作为后续动态密码生成的核心，必须对外保密。</section>
</li>
</ul>
</li>
<li>
<section style="color: #010101;">
<p style="color: #000000;"><strong style="color: #0e88eb;">生成二维码</strong>：</p>
</section>
<ul class="list-paddingleft-1">
<li>
<section style="color: #010101;"><code style="color: #0e8aeb;">Example</code>: 服务提供方的名称。</section>
</li>
<li>
<section style="color: #010101;"><code style="color: #0e8aeb;">username@example.com</code>: 用户的账户。在 github 的场景中这个字段是没有的。</section>
</li>
<li>
<section style="color: #010101;"><code style="color: #0e8aeb;">SECRET=JBSWY3DPEHPK3PXP</code>: 共享密钥。</section>
</li>
<li>
<section style="color: #010101;"><code style="color: #0e8aeb;">issuer=Example</code>: 服务提供方名称（用于显示在 Google Authenticator 中）。</section>
</li>
</ul>
<ul class="list-paddingleft-1">
<li>
<section style="color: #010101;">
<p style="color: #000000;">服务端将共享密钥和其他元信息（如站点名称、用户账户）打包成一个 URL，符合<code style="color: #0e8aeb;">otpauth://</code> 协议格式，例如：</p>
<pre><code style="color: #0e8aeb;">otpauth://totp/Example:username@example.com?secret=JBSWY3DPEHPK3PXP&amp;issuer=Example
</code></pre>
<p style="color: #000000;">其中：</p>
</section>
</li>
<li>
<section style="color: #010101;">
<p style="color: #000000;">该 URL 会被编码为一个二维码，供用户扫描。</p>
</section>
</li>
</ul>
</li>
<li>
<section style="color: #010101;">
<p style="color: #000000;"><strong style="color: #0e88eb;">用户扫描二维码</strong>：</p>
</section>
<ul class="list-paddingleft-1">
<li>
<section style="color: #010101;">用户使用 Google Authenticator 应用扫描二维码，应用会解析出共享密钥（<code style="color: #0e8aeb;">K</code>）以及站点相关信息，并将其安全存储在手机本地。</section>
</li>
<li>
<section style="color: #010101;">共享密钥在手机端不会传回服务端，所有计算均在本地完成。</section>
</li>
</ul>
</li>
<li>
<section style="color: #010101;">
<p style="color: #000000;"><strong style="color: #0e88eb;">初始化完成</strong>：</p>
</section>
<ul class="list-paddingleft-1">
<li>
<section style="color: #010101;">用户的 Google Authenticator 应用现在可以基于共享密钥<code style="color: #0e8aeb;">K</code> 和当前时间生成动态密码。</section>
</li>
<li>
<section style="color: #010101;">服务端同时将该共享密钥<code style="color: #0e8aeb;">K</code> 绑定到用户账户，并妥善保存以便后续验证使用。</section>
</li>
</ul>
</li>
</ol>
<h2 style="color: #000000;" data-tool="mdnice编辑器"><span style="font-weight: bold; color: #0e8aeb;">6.2 验证阶段：动态密码的生成与验证</span></h2>
<p style="color: #000000;" data-tool="mdnice编辑器">这是用户登录时的验证过程。在此阶段，客户端和服务端基于相同的共享密钥<code style="color: #0e8aeb;">K</code> 和时间步长计算动态密码，并进行验证。</p>
<h3 style="color: #000000;" data-tool="mdnice编辑器"><span style="font-weight: bold; color: #0e88eb;">6.2.1 客户端生成动态密码</span></h3>
<ol class="list-paddingleft-1" style="color: #000000;">
<li>
<section style="color: #010101;">
<p style="color: #000000;"><strong style="color: #0e88eb;">获取当前时间</strong>：</p>
</section>
<ul class="list-paddingleft-1">
<li>
<section style="color: #010101;">Google Authenticator 应用从设备的系统时间中获取当前的 Unix 时间戳（以秒为单位）。</section>
</li>
</ul>
</li>
<li>
<section style="color: #010101;">
<p style="color: #000000;"><strong style="color: #0e88eb;">将时间戳转换为时间步长</strong>：</p>
</section>
<ul class="list-paddingleft-1">
<li>
<section style="color: #010101;">将时间戳除以时间步长（通常为 30 秒），并取整：</p>
<pre><code style="color: #0e8aeb;">T = floor(currentUnixTime / timeStep)
</code></pre>
<p>例如，当前时间是<code style="color: #0e8aeb;">1697031000</code> 秒，时间步长为 30 秒，则：</p>
<pre><code style="color: #0e8aeb;">T = floor(1697031000 / 30) = 56567700
</code></pre>
</section>
</li>
</ul>
</li>
<li>
<section style="color: #010101;">
<p style="color: #000000;"><strong style="color: #0e88eb;">计算 HMAC-SHA-1 哈希值</strong>：</p>
</section>
<ul class="list-paddingleft-1">
<li>
<section style="color: #010101;">Google Authenticator 将时间步长<code style="color: #0e8aeb;">T</code> 转换为 8 字节的 Big-endian 格式（例如<code style="color: #0e8aeb;">0x00000000056567700</code>）。</section>
</li>
<li>
<section style="color: #010101;">使用共享密钥<code style="color: #0e8aeb;">K</code> 和时间步长<code style="color: #0e8aeb;">T</code> 作为输入，计算 HMAC-SHA-1 哈希值：</p>
<pre><code style="color: #0e8aeb;">HMAC = HMAC-SHA-1(K, T)
</code></pre>
<p>结果是一个 20 字节（160 位）的哈希值。</section>
</li>
</ul>
</li>
<li>
<section style="color: #010101;">
<p style="color: #000000;"><strong style="color: #0e88eb;">截断哈希值</strong>：</p>
</section>
<ul class="list-paddingleft-1">
<li>
<section style="color: #010101;">根据 HMAC 的最后一个字节的低 4 位，确定一个偏移量<code style="color: #0e8aeb;">offset</code>。</section>
</li>
<li>
<section style="color: #010101;">从 HMAC 中偏移量开始，提取连续 4 个字节，生成动态二进制码（Dynamic Binary Code，DBC）。</section>
</li>
<li>
<section style="color: #010101;">对提取的 4 字节数据按无符号整数格式解释，并将最高位（符号位）置零，确保结果为正整数。</section>
</li>
</ul>
</li>
<li>
<section style="color: #010101;">
<p style="color: #000000;"><strong style="color: #0e88eb;">取模生成动态密码</strong>：</p>
</section>
<ul class="list-paddingleft-1">
<li>
<section style="color: #010101;">对动态二进制码取模<code style="color: #0e8aeb;">10^6</code>，生成 6 位数字密码：</p>
<pre><code style="color: #0e8aeb;">OTP = DBC % 10^6
</code></pre>
<p>例如，计算结果为<code style="color: #0e8aeb;">123456</code>。</section>
</li>
</ul>
</li>
<li>
<section style="color: #010101;">
<p style="color: #000000;"><strong style="color: #0e88eb;">显示动态密码</strong>：</p>
</section>
<ul class="list-paddingleft-1">
<li>
<section style="color: #010101;">Google Authenticator 将生成的 6 位动态密码显示给用户，该密码有效时间为一个时间步长（通常为 30 秒）。</section>
</li>
</ul>
</li>
</ol>
<h3 style="color: #000000;" data-tool="mdnice编辑器"><span style="font-weight: bold; color: #0e88eb;">6.2.3 服务端验证动态密码</span></h3>
<ol class="list-paddingleft-1" style="color: #000000;">
<li>
<section style="color: #010101;">
<p style="color: #000000;"><strong style="color: #0e88eb;">服务端获取当前时间</strong>：</p>
</section>
<ul class="list-paddingleft-1">
<li>
<section style="color: #010101;">服务端同样获取当前的 Unix 时间戳，并计算对应的时间步长<code style="color: #0e8aeb;">T</code>。</section>
</li>
</ul>
</li>
<li>
<section style="color: #010101;">
<p style="color: #000000;"><strong style="color: #0e88eb;">计算候选动态密码</strong>：</p>
</section>
<ul class="list-paddingleft-1">
<li>
<section style="color: #010101;">服务端使用用户账户绑定的共享密钥<code style="color: #0e8aeb;">K</code> 和当前时间步长<code style="color: #0e8aeb;">T</code>，通过与客户端相同的 TOTP 算法计算动态密码。</section>
</li>
<li>
<section style="color: #010101;">为了容忍客户端和服务端的时间差异，服务端通常会计算当前时间步长<code style="color: #0e8aeb;">T</code> 以及前后几个时间步长（例如<code style="color: #0e8aeb;">T-1</code> 和<code style="color: #0e8aeb;">T+1</code>）的动态密码，形成候选密码列表。</section>
</li>
</ul>
</li>
<li>
<section style="color: #010101;">
<p style="color: #000000;"><strong style="color: #0e88eb;">验证动态密码</strong>：</p>
</section>
<ul class="list-paddingleft-1">
<li>
<section style="color: #010101;">如果匹配成功，则验证通过，用户被允许登录。</section>
</li>
<li>
<section style="color: #010101;">如果所有候选密码都不匹配，则验证失败，拒绝用户登录。</section>
</li>
</ul>
<ul class="list-paddingleft-1">
<li>
<section style="color: #010101;">服务端将用户提交的动态密码与候选密码列表逐一比对：</section>
</li>
</ul>
</li>
</ol>
<h2 style="color: #000000;" data-tool="mdnice编辑器"><span style="font-weight: bold; color: #0e8aeb;">6.3 关键数据的传递过程</span></h2>
<p style="color: #000000;" data-tool="mdnice编辑器">在整个验证过程中，关键数据的传递和使用如下：</p>
<h3 style="color: #000000;" data-tool="mdnice编辑器"><span style="font-weight: bold; color: #0e88eb;">6.3.1<strong>初始化阶段</strong></span></h3>
<ul class="list-paddingleft-1" style="color: #000000;">
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">服务端 → 客户端</strong>：</section>
<ul class="list-paddingleft-1">
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">共享密钥（K）</strong>：通过二维码或手动输入传递给 Google Authenticator。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">站点信息</strong>：站点名称、账户名等信息也通过二维码传递。</section>
</li>
</ul>
</li>
</ul>
<h3 style="color: #000000;" data-tool="mdnice编辑器"><span style="font-weight: bold; color: #0e88eb;">6.3.2<strong>验证阶段</strong></span></h3>
<ul class="list-paddingleft-1" style="color: #000000;">
<li>
<section style="color: #010101;">
<p style="color: #000000;"><strong style="color: #0e88eb;">客户端</strong>：</p>
</section>
<ul class="list-paddingleft-1">
<li>
<section style="color: #010101;">本地保存的共享密钥<code style="color: #0e8aeb;">K</code> 和当前时间计算动态密码。</section>
</li>
<li>
<section style="color: #010101;">用户将动态密码（6 位数字）手动输入到登录页面。</section>
</li>
</ul>
</li>
<li>
<section style="color: #010101;">
<p style="color: #000000;"><strong style="color: #0e88eb;">客户端 → 服务端</strong>：</p>
</section>
<ul class="list-paddingleft-1">
<li>
<section style="color: #010101;">用户提交动态密码（6 位数字）和其他常规登录凭据（如用户名、密码）。</section>
</li>
</ul>
</li>
<li>
<section style="color: #010101;">
<p style="color: #000000;"><strong style="color: #0e88eb;">服务端</strong>：</p>
</section>
<ul class="list-paddingleft-1">
<li>
<section style="color: #010101;">使用同样的共享密钥<code style="color: #0e8aeb;">K</code> 和时间步长计算候选动态密码。</section>
</li>
<li>
<section style="color: #010101;">对比用户提交的动态密码与计算结果，完成验证。</section>
</li>
</ul>
</li>
</ul>
<p style="color: #000000;" data-tool="mdnice编辑器">整个过程有如下的一些关键点：</p>
<ol class="list-paddingleft-1" style="color: #000000;">
<li>
<section style="color: #010101;">
<p style="color: #000000;"><strong style="color: #0e88eb;">共享密钥的安全性</strong>：</p>
</section>
<ul class="list-paddingleft-1">
<li>
<section style="color: #010101;">共享密钥<code style="color: #0e8aeb;">K</code> 是整个验证过程的核心，必须在初始化阶段通过安全的方式传递，并在客户端和服务端妥善保存。</section>
</li>
<li>
<section style="color: #010101;">密钥不会在验证阶段传输，只有动态密码被提交。</section>
</li>
</ul>
</li>
<li>
<section style="color: #010101;">
<p style="color: #000000;"><strong style="color: #0e88eb;">时间同步</strong>：</p>
</section>
<ul class="list-paddingleft-1">
<li>
<section style="color: #010101;">客户端和服务端的时间必须保持同步，否则计算的时间步长<code style="color: #0e8aeb;">T</code> 会不一致，导致动态密码验证失败。</section>
</li>
<li>
<section style="color: #010101;">为了适应设备的时间漂移，服务端通常允许一定的时间步长偏移（如 ±1 步长）。</section>
</li>
</ul>
</li>
<li>
<section style="color: #010101;">
<p style="color: #000000;"><strong style="color: #0e88eb;">动态密码的短生命周期</strong>：</p>
</section>
<ul class="list-paddingleft-1">
<li>
<section style="color: #010101;">动态密码的有效时间通常为一个时间步长（30 秒），即使密码被窃取，也很快失效。</section>
</li>
</ul>
</li>
<li>
<section style="color: #010101;">
<p style="color: #000000;"><strong style="color: #0e88eb;">离线生成</strong>：</p>
</section>
<ul class="list-paddingleft-1">
<li>
<section style="color: #010101;">动态密码的生成完全依赖共享密钥和时间，无需网络连接，增强了安全性。</section>
</li>
</ul>
</li>
</ol>
<h1 style="color: #000000;" data-tool="mdnice编辑器"><span style="font-weight: bold; color: #0e8aeb;">7. 小结</span></h1>
<p style="color: #000000;" data-tool="mdnice编辑器">通过 GitHub 强制推行 MFA 的案例，我们可以清晰地看到，MFA 已经成为现代身份管理的重要基石。密码本身的弱点让账户安全长期处于威胁之下，而 MFA 的引入不仅为用户增加了一层甚至多层防护，更在技术上为身份验证树立了一个全新的标准。</p>
<p style="color: #000000;" data-tool="mdnice编辑器">尽管 MFA 并非完美，还存在用户体验、实施成本和一定的攻击风险，但它在密码安全性危机中提供了一种强有力的解决方案。无论是个人用户还是企业，采用 MFA 已经成为抵御网络威胁的必要手段。</p>
<p style="color: #000000;" data-tool="mdnice编辑器">未来，随着技术的进一步发展，多因子认证可能会越来越多地融合生物特征、行为分析和人工智能技术，为用户提供更安全且更便捷的身份验证体验。而对于每一位开发者和用户来说，理解和使用这些技术，不仅是保护自身数字资产的关键，更是应对日益复杂的网络安全形势的必修课。</p>
<p style="color: #000000;" data-tool="mdnice编辑器">以上。</p>
]]></content:encoded>
			<wfw:commentRss>https://www.phppan.com/2024/12/architect-must-know-mfa-introduction/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>聊下 SaaS 初创企业的安全策略</title>
		<link>https://www.phppan.com/2024/08/talk-about-security-strategies-for-saas-startups/</link>
		<comments>https://www.phppan.com/2024/08/talk-about-security-strategies-for-saas-startups/#comments</comments>
		<pubDate>Fri, 30 Aug 2024 23:52:54 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[架构和远方]]></category>
		<category><![CDATA[SaaS]]></category>
		<category><![CDATA[创业]]></category>
		<category><![CDATA[安全]]></category>
		<category><![CDATA[架构]]></category>

		<guid isPermaLink="false">http://www.phppan.com/?p=2271</guid>
		<description><![CDATA[在这个数字化高度依赖的时代，安全不仅仅是一种防御手段，更是一种核心竞争力。对于 SaaS 初创企业而言，安全策 [&#8230;]]]></description>
				<content:encoded><![CDATA[<p style="color: #000000;" data-tool="mdnice编辑器">在这个数字化高度依赖的时代，安全不仅仅是一种防御手段，更是一种核心竞争力。对于 SaaS 初创企业而言，安全策略的构建如同奠定企业发展的基石，决定着未来的稳定与可持续性。</p>
<p style="color: #000000;" data-tool="mdnice编辑器">在开始构建基于云服务的 SaaS 平台时，如何在前期制定全面而有效的安全策略，将直接影响公司能否在激烈的市场竞争中立于不败之地。任何忽视安全的行为，都会为企业未来的成长埋下隐患。</p>
<p style="color: #000000;" data-tool="mdnice编辑器">今天我们要聊的安全仅仅是狭义上的安全，包括外部的攻击，以及企业内部管理不规范或误操作导致的安全问题等。</p>
<p style="color: #000000;" data-tool="mdnice编辑器">SaaS 初创业企业的安全策略包括外部安全和内部安全两大方面。每个方面都是针对特定的安全问题而梳理的，都会有对应的解法。</p>
<h1 style="color: #000000;" data-tool="mdnice编辑器"><span style="font-weight: bold;">1 外部安全</span></h1>
<p style="color: #000000;" data-tool="mdnice编辑器">外部安全主要涉及防范来自外部的威胁，如网络攻击、中间人攻击、数据泄露等。以下是关键领域及其应对策略：</p>
<h2 style="color: #000000;" data-tool="mdnice编辑器"><span style="font-weight: bold; color: #ffffff;">1.1 网络安全</span></h2>
<p style="color: #000000;" data-tool="mdnice编辑器"><strong>安全问题</strong>：网络安全是外部安全的核心，涉及防护企业网络免受各种外部威胁的攻击。常见的网络威胁包括 DDoS 攻击、SQL 注入、中间人攻击等。这些攻击可能导致服务中断、数据泄露，甚至系统被完全控制。</p>
<p style="color: #000000;" data-tool="mdnice编辑器"><strong>解决方案</strong>：</p>
<ul class="list-paddingleft-1" style="color: #000000;" data-tool="mdnice编辑器">
<li>
<section style="color: #010101;"><strong style="color: #000000;">防火墙与 DDoS 防护</strong>：部署多层防火墙，包括应用层和网络层防火墙，以过滤恶意流量。通过云服务提供商（如阿里云、腾讯云、AWS）的 DDoS 防护服务，可以自动检测并缓解大规模流量攻击。<strong style="color: #000000;">早期考虑先上一波动态 CDN</strong>。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #000000;">加密通信</strong>：强制使用 HTTPS（TLS/SSL） 来加密数据在传输过程中的安全性。确保所有的 API 接口和 Web 应用都使用强加密协议，防止数据在传输过程中的窃听和篡改。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #000000;">入侵检测与防御</strong>：部署入侵检测系统（IDS）和入侵防御系统（IPS），实时监控网络流量，识别并阻止可疑活动。IDS/IPS可以帮助发现并响应攻击者的尝试，避免其进一步渗透。</section>
</li>
</ul>
<p style="color: #000000;" data-tool="mdnice编辑器"><strong>注意事项</strong></p>
<ul class="list-paddingleft-1" style="color: #000000;" data-tool="mdnice编辑器">
<li>
<section style="color: #010101;">定期审查防火墙规则和策略，确保其适应最新的安全需求。</section>
</li>
<li>
<section style="color: #010101;">确保TLS/SSL证书的有效性，并及时更新证书，防止过期导致的安全风险。</section>
</li>
<li>
<section style="color: #010101;">入侵检测系统的规则库需要定期更新，以应对新出现的攻击手段。</section>
</li>
</ul>
<h2 style="color: #000000;" data-tool="mdnice编辑器"><span style="font-weight: bold; color: #ffffff;">1.2 应用安全</span></h2>
<p style="color: #000000;" data-tool="mdnice编辑器"><strong>安全问题</strong>：SaaS 应用程序是客户与服务的直接交互层，应用层的安全问题（如 SQL 注入、跨站脚本攻击 XSS ）可能被利用来进行未授权的操作或数据泄露。</p>
<p style="color: #000000;" data-tool="mdnice编辑器"><strong>解决方案</strong>：</p>
<ul class="list-paddingleft-1" style="color: #000000;" data-tool="mdnice编辑器">
<li>
<section style="color: #010101;"><strong style="color: #000000;">定期代码审计</strong>：使用静态代码分析工具（如SonarQube）和动态应用安全测试（DAST）工具，定期对代码进行审查，发现并修复潜在的安全漏洞。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #000000;">安全编码实践</strong>：遵循 OWASP 提供的安全编码标准，防止常见的应用层攻击，如 SQL 注入、XSS、CSRF 等。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #000000;">Web 应用防火墙（WAF）</strong>：部署 WAF 来检测并阻止恶意的 HTTP 流量。<strong style="color: #000000;">常见的应用攻击以及一些爬虫的防御策略都可以在 WAF 中落地</strong>，在云服务产品中有点小贵。</section>
</li>
</ul>
<h2 style="color: #000000;" data-tool="mdnice编辑器"><span style="font-weight: bold; color: #ffffff;">1.3 数据安全</span></h2>
<p style="color: #000000;" data-tool="mdnice编辑器">数据安全是 SaaS 初创企业保护其核心资产的关键领域之一。无论是存储、传输、处理还是备份，数据安全问题都可能导致严重的业务中断、数据泄露，以及客户信任的丧失。</p>
<h3 style="color: #000000;" data-tool="mdnice编辑器"><span style="font-weight: bold;">1.3.1 数据存储与访问控制</span></h3>
<p style="color: #000000;" data-tool="mdnice编辑器"><strong>安全问题</strong>： 数据存储和访问控制是数据安全的基础。如果存储的数据未加密或访问控制不当，攻击者可能通过各种方式获取敏感数据。<strong>未授权的访问、数据泄露、或越权操作</strong>可能导致严重的安全和合规性问题。</p>
<p style="color: #000000;" data-tool="mdnice编辑器"><strong>解决方案</strong>：</p>
<ul class="list-paddingleft-1" style="color: #000000;" data-tool="mdnice编辑器">
<li>
<section style="color: #010101;"><strong style="color: #000000;">数据加密</strong>：在存储数据时，使用强加密算法（如AES-256）对<strong style="color: #000000;">敏感数据</strong>进行加密。无论是数据库、文件存储还是备份数据，都应确保其在静态状态下（即存储时）是加密的。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #000000;">访问控制</strong>：实施基于角色的访问控制（RBAC），确保只有授权用户可以访问特定的数据。使用最小权限原则，限制用户对数据的访问权限，防止越权操作。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #000000;">多因素认证（MFA）</strong>：在访问敏感数据时，强制使用多因素认证，增加额外的安全层，防止因凭证泄露导致的数据泄露。在各家云服务厂商 MFA 已经在普遍应用了。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #000000;">数据隔离</strong>：根据用户或应用的不同需求，实施数据隔离策略，确保不同的数据集之间没有不必要的访问路径，防止数据被滥用或误用。</section>
</li>
</ul>
<p style="color: #000000;" data-tool="mdnice编辑器"><strong>注意事项</strong>：</p>
<ul class="list-paddingleft-1" style="color: #000000;" data-tool="mdnice编辑器">
<li>
<section style="color: #010101;"><strong style="color: #000000;">定期审查权限</strong>：定期审查和更新用户权限，<strong style="color: #000000;">尤其是在员工角色变更或离职时</strong>，确保权限及时调整或撤销，防止滥用。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #000000;">加密密钥管理</strong>：妥善管理加密密钥，防止其泄露或丢失。采用 KMS 来管理密钥生命周期。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #000000;">日志审计</strong>：启用详细的访问日志，审计所有的数据访问和操作记录，并定期分析日志以发现潜在的安全问题。</section>
</li>
</ul>
<h3 style="color: #000000;" data-tool="mdnice编辑器"><span style="font-weight: bold;">1.3.2 数据备份与恢复</span></h3>
<p style="color: #000000;" data-tool="mdnice编辑器"><strong>安全问题</strong>：数据备份是确保在数据丢失或损坏时能够恢复的关键措施。然而，如果备份策略不完善或备份存储位置不安全，备份数据本身可能成为攻击者的目标，导致数据泄露或业务中断。</p>
<p style="color: #000000;" data-tool="mdnice编辑器"><strong>解决方案</strong></p>
<ul class="list-paddingleft-1" style="color: #000000;" data-tool="mdnice编辑器">
<li>
<section style="color: #010101;"><strong style="color: #000000;">备份策略</strong>：制定合理的备份策略，确保关键数据定期备份。使用增量备份和全量备份相结合的方式，平衡存储空间和恢复时间。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #000000;">多重备份存储</strong>：将备份数据存储在多个物理位置或云服务中，防止单点故障。可以使用云端备份解决方案（如阿里云、腾讯云的备份服务）结合本地存储进行多重备份。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #000000;">备份恢复演练</strong>：定期进行数据恢复演练，确保备份数据在紧急情况下能够快速恢复，验证备份的可用性和恢复时间。上次语雀故障恢复时长超出预期的一个核心原因就是备份恢复的数据问题。</section>
</li>
</ul>
<p style="color: #000000;" data-tool="mdnice编辑器"><strong>注意事项</strong></p>
<ul class="list-paddingleft-1" style="color: #000000;" data-tool="mdnice编辑器">
<li>
<section style="color: #010101;"><strong style="color: #000000;">备份保留策略</strong>：合理设置备份保留时间，确保数据的历史版本可以在特定时间内恢复，但不至于占用过多存储空间。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #000000;">备份访问控制</strong>：加强对备份存储位置的访问控制，防止未经授权的访问或下载。确保只有必要的人员和系统能够访问备份数据。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #000000;">备份日志审计</strong>：记录备份和恢复操作日志，定期审查日志以确保备份操作的合规性和安全性，发现并处理任何异常行为。</section>
</li>
</ul>
<h1 style="color: #000000;" data-tool="mdnice编辑器"><span style="font-weight: bold;">2 内部安全</span></h1>
<p style="color: #000000;" data-tool="mdnice编辑器">内部安全主要关注内部人员或系统的安全问题，包括账号被盗用、权限管理不当，越权访问、删库跑路等等。这些问题如果处理不当，可能导致敏感数据泄露、业务中断，甚至让公司关门。</p>
<p style="color: #000000;" data-tool="mdnice编辑器">在内部安全中，主机安全、数据安全、代码安全、日志安全和第三方系统安全是保护企业内部系统和数据的关键领域。每个领域都有其独特的安全挑战，需要通过制定和实施有效的策略来应对。</p>
<h2 style="color: #000000;" data-tool="mdnice编辑器"><span style="font-weight: bold; color: #ffffff;">2.1 主机安全</span></h2>
<p style="color: #000000;" data-tool="mdnice编辑器"><strong>安全问题</strong></p>
<ul class="list-paddingleft-1" style="color: #000000;" data-tool="mdnice编辑器">
<li>
<section style="color: #010101;"><strong style="color: #000000;">未授权访问</strong>：如果对主机的访问控制不严，内部用户或攻击者可能获得未授权的访问权限，导致系统被滥用或破坏。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #000000;">操作系统漏洞</strong>：主机上的操作系统和服务可能存在未修补的漏洞，这些漏洞可能被攻击者利用来获取控制权或窃取数据。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #000000;">缺乏监控和审计</strong>：如果缺乏对主机操作的实时监控和日志审计，恶意活动可能无法被及时发现和阻止。</section>
</li>
</ul>
<p style="color: #000000;" data-tool="mdnice编辑器"><strong>解决方案</strong></p>
<ul class="list-paddingleft-1" style="color: #000000;" data-tool="mdnice编辑器">
<li>
<section style="color: #010101;"><strong style="color: #000000;">统一账号管理</strong>：使用集中式的身份和访问管理（IAM）系统，统一管理主机的访问权限，确保只有授权用户能够访问关键主机。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #000000;">定期更新与补丁管理</strong>：确保操作系统和应用程序定期更新，及时应用所有安全补丁以修复已知漏洞。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #000000;">使用堡垒机</strong>：通过堡垒机来集中管理对所有主机的访问，所有操作通过堡垒机进行，并记录详细日志，确保操作的可追溯性。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #000000;">日志审计</strong>：启用并配置详细的操作日志审计系统，定期审查日志，发现并响应异常行为。</section>
</li>
</ul>
<p style="color: #000000;" data-tool="mdnice编辑器"><strong>注意事项</strong></p>
<ul class="list-paddingleft-1" style="color: #000000;" data-tool="mdnice编辑器">
<li>
<section style="color: #010101;"><strong style="color: #000000;">权限最小化</strong>：严格遵循最小权限原则，确保用户只能访问他们完成工作所需的资源。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #000000;">监控与报警</strong>：配置实时监控和报警系统，及时通知管理员任何异常活动，如未经授权的登录尝试或关键服务的异常行为。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #000000;">日志保护</strong>：确保日志文件的完整性，防止日志记录被篡改或删除，以维护操作活动的可追溯性。</section>
</li>
</ul>
<h2 style="color: #000000;" data-tool="mdnice编辑器"><span style="font-weight: bold; color: #ffffff;">2.2 数据安全</span></h2>
<p style="color: #000000;" data-tool="mdnice编辑器"><strong>安全问题</strong></p>
<ul class="list-paddingleft-1" style="color: #000000;" data-tool="mdnice编辑器">
<li>
<section style="color: #010101;"><strong style="color: #000000;">越权访问</strong>：后台管理系统如果权限控制不严，可能导致用户访问到不应有的数据或功能，引发数据泄露或误操作。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #000000;">数据泄露</strong>：如果后台系统处理的数据未经加密或脱敏，敏感信息可能被内部人员或攻击者窃取。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #000000;">操作审计不足</strong>：缺乏对后台管理系统操作的审计和监控，可能导致恶意或错误操作未被及时发现。</section>
</li>
</ul>
<p style="color: #000000;" data-tool="mdnice编辑器"><strong>解决方案</strong></p>
<ul class="list-paddingleft-1" style="color: #000000;" data-tool="mdnice编辑器">
<li>
<section style="color: #010101;"><strong style="color: #000000;">基于角色的访问控制</strong>：在后台管理系统中实施 RBAC，确保不同角色只能访问与其职责相关的数据和功能，防止越权操作。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #000000;">数据脱敏与加密</strong>：对后台系统中处理的敏感数据进行加密，并在展示或导出时进行脱敏处理，确保敏感信息不被泄露。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #000000;">操作日志记录</strong>：记录所有后台管理系统的操作日志，特别是涉及数据访问、修改和删除的操作，确保所有活动可追溯。</section>
</li>
</ul>
<p style="color: #000000;" data-tool="mdnice编辑器"><strong>注意事项</strong></p>
<ul class="list-paddingleft-1" style="color: #000000;" data-tool="mdnice编辑器">
<li>
<section style="color: #010101;"><strong style="color: #000000;">定期权限审查</strong>：定期审查和更新后台系统的用户权限，防止权限滥用或遗留的过期权限。这在实际工作中经常会遇到，因为开放了权限了后面基本就不管了，至少在权限管理上增加一个时间的限制。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #000000;">异常操作监控</strong>：配置实时监控，识别和报警异常操作，如大规模数据导出或频繁的权限变更。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #000000;">日志保护与分析</strong>：确保操作日志的完整性和安全性，定期分析日志以发现潜在的安全威胁。</section>
</li>
</ul>
<h2 style="color: #000000;" data-tool="mdnice编辑器"><span style="font-weight: bold; color: #ffffff;">2.3 代码安全</span></h2>
<p style="color: #000000;" data-tool="mdnice编辑器"><strong>安全问题</strong></p>
<ul class="list-paddingleft-1" style="color: #000000;" data-tool="mdnice编辑器">
<li>
<section style="color: #010101;"><strong style="color: #000000;">代码漏洞</strong>：不安全的编码实践可能导致代码中存在安全漏洞，如 SQL 注入、XSS、CSRF 等，攻击者可以利用这些漏洞入侵系统或窃取数据。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #000000;">代码泄露</strong>：如果代码管理不当，源代码可能泄露，攻击者可以分析代码并发现潜在的安全漏洞。甚至整个代码被竞争对手拿走分析。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #000000;">代码变更未经审核</strong>：未经审核的代码变更可能引入新的漏洞或破坏现有的安全控制，增加系统的安全风险。</section>
</li>
</ul>
<p style="color: #000000;" data-tool="mdnice编辑器"><strong>解决方案</strong></p>
<ul class="list-paddingleft-1" style="color: #000000;" data-tool="mdnice编辑器">
<li>
<section style="color: #010101;"><strong style="color: #000000;">安全编码规范</strong>：制定并强制执行安全编码规范，确保开发人员遵循最佳安全实践，如输入验证、输出编码等。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #000000;">代码审查与静态分析</strong>：在代码提交前进行代码审查，并使用静态代码分析工具（如 SonarQube ）自动检测潜在的安全漏洞。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #000000;">版本控制与权限管理</strong>：使用版本控制系统（如Git）管理代码，并严格控制代码库的访问权限，确保只有授权人员能够查看和修改代码。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #000000;">持续集成与安全测试</strong>：在持续集成（CI）过程中引入安全测试，自动化发现和修复代码中的安全问题。</section>
</li>
</ul>
<p style="color: #000000;" data-tool="mdnice编辑器"><strong>注意事项</strong></p>
<ul class="list-paddingleft-1" style="color: #000000;" data-tool="mdnice编辑器">
<li>
<section style="color: #010101;"><strong style="color: #000000;">定期安全培训</strong>：定期对开发人员进行安全培训，提升其安全意识和能力，防止常见的编码错误。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #000000;">敏感信息保护</strong>：确保代码库中不包含敏感信息，如硬编码的密码或API密钥，使用安全的方式管理这些信息。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #000000;">变更管理</strong>：所有代码变更必须经过严格的审核流程，确保新代码不会引入安全问题，并记录变更日志以备审计。</section>
</li>
</ul>
<h2 style="color: #000000;" data-tool="mdnice编辑器"><span style="font-weight: bold; color: #ffffff;">2.4 日志安全</span></h2>
<p style="color: #000000;" data-tool="mdnice编辑器"><strong>安全问题</strong></p>
<ul class="list-paddingleft-1" style="color: #000000;" data-tool="mdnice编辑器">
<li>
<section style="color: #010101;"><strong style="color: #000000;">日志数据泄露</strong>：如果日志包含未脱敏的敏感信息，攻击者可能通过获取日志文件来窃取这些信息。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #000000;">日志篡改</strong>：攻击者可能篡改或删除日志记录，掩盖其恶意行为，使得调查和取证变得困难。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #000000;">日志存储不足</strong>：日志存储不当或容量不足可能导致日志丢失，影响问题的追溯和分析。</section>
</li>
</ul>
<p style="color: #000000;" data-tool="mdnice编辑器"><strong>解决方案</strong></p>
<ul class="list-paddingleft-1" style="color: #000000;" data-tool="mdnice编辑器">
<li>
<section style="color: #010101;"><strong style="color: #000000;">日志脱敏与加密</strong>：在生成日志时对包含敏感信息的字段进行脱敏处理，并对日志文件进行加密存储，防止信息泄露。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #000000;">集中化日志管理</strong>：使用集中化的日志管理工具（如ELK Stack）来统一收集、存储和分析日志，确保日志的完整性和可用性。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #000000;">日志完整性校验</strong>：使用哈希校验或数字签名保护日志文件，防止日志被篡改，确保日志记录的真实性和完整性。</section>
</li>
</ul>
<p style="color: #000000;" data-tool="mdnice编辑器"><strong>注意事项</strong></p>
<ul class="list-paddingleft-1" style="color: #000000;" data-tool="mdnice编辑器">
<li>
<section style="color: #010101;"><strong style="color: #000000;">日志保留策略</strong>：制定合理的日志保留策略，确保重要日志能够长期存储，以满足合规和审计要求。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #000000;">访问控制</strong>：严格限制对日志文件的访问权限，确保只有授权人员能够查看和分析日志。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #000000;">日志监控与报警</strong>：实时监控日志中的异常行为，设置自动报警机制，及时发现并响应潜在的安全事件。</section>
</li>
</ul>
<h2 style="color: #000000;" data-tool="mdnice编辑器"><span style="font-weight: bold; color: #ffffff;">2.5 第三方系统安全</span></h2>
<p style="color: #000000;" data-tool="mdnice编辑器"><strong>安全问题</strong></p>
<ul class="list-paddingleft-1" style="color: #000000;" data-tool="mdnice编辑器">
<li>
<section style="color: #010101;"><strong style="color: #000000;">第三方系统漏洞</strong>：如果企业依赖的第三方系统存在安全漏洞，这些漏洞可能被攻击者利用，危及企业的整体安全。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #000000;">第三方系统配置不当</strong>：错误的配置或使用默认配置可能导致第三方系统暴露在外部攻击者面前。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #000000;">集成安全风险</strong>：与第三方系统的集成可能引入新的安全风险，尤其是在数据共享和权限管理方面。</section>
</li>
</ul>
<p style="color: #000000;" data-tool="mdnice编辑器"><strong>解决方案</strong></p>
<ul class="list-paddingleft-1" style="color: #000000;" data-tool="mdnice编辑器">
<li>
<section style="color: #010101;"><strong style="color: #000000;">定期安全评估</strong>：定期对第三方系统进行安全评估，识别并修复潜在的安全漏洞。确保所有第三方系统保持最新版本，及时应用安全补丁。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #000000;">安全配置管理</strong>：根据最佳实践配置第三方系统，禁用默认账户和配置，使用强密码和加密通信，确保系统的安全性。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #000000;">集成安全控制</strong>：在与第三方系统集成时，实施严格的安全控制措施，如API访问控制、数据加密和请求验证，防止集成过程中出现安全问题。</section>
</li>
</ul>
<p style="color: #000000;" data-tool="mdnice编辑器"><strong>注意事项</strong></p>
<ul class="list-paddingleft-1" style="color: #000000;" data-tool="mdnice编辑器">
<li>
<section style="color: #010101;"><strong style="color: #000000;">供应商管理</strong>：选择信誉良好的第三方供应商，并定期审查其安全实践，确保其符合企业的安全要求。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #000000;">合同与责任划分</strong>：在与第三方签订合同时，明确各方的安全责任和应对措施，确保在出现安全问题时能够明确责任。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #000000;">持续监控</strong>：对第三方系统的运行状态和安全日志进行持续监控，及时发现和响应潜在的安全事件。</section>
</li>
</ul>
<h1 style="color: #000000;" data-tool="mdnice编辑器"><span style="font-weight: bold;">小结</span></h1>
<p style="color: #000000;" data-tool="mdnice编辑器">通过从外部安全和内部安全两个视角来审视 SaaS 类初创企业的安全策略，可以更全面地识别和应对各类安全风险。</p>
<p style="color: #000000;" data-tool="mdnice编辑器"><strong>外部安全侧重于防范来自外部攻击者的威胁</strong>，如网络攻击、应用漏洞利用等；<strong>内部安全则关注内部用户、流程和系统可能引发的安全问题</strong>，如权限管理、员工安全意识等。只有同时重视外部安全和内部安全，并采取相应的防护措施，才能为 SaaS 企业构建一个全方位的安全防御体系。</p>
<p style="color: #000000;" data-tool="mdnice编辑器">安全并非一蹴而就，而是一个持续演进的过程。无论是外部威胁的防范还是内部安全的管理，都需要保持高度的敏感性和前瞻性。SaaS 企业的成功不仅仅依赖于技术创新，更依赖于对安全的承诺与执行力。唯有将安全视作企业文化的一部分，融入到每一步的决策与行动中，才能在风云变幻的市场中行稳致远，真正建立起客户信任的堡垒。</p>
]]></content:encoded>
			<wfw:commentRss>https://www.phppan.com/2024/08/talk-about-security-strategies-for-saas-startups/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>聊下 SaaS 产品的核心问题：用户资产安全</title>
		<link>https://www.phppan.com/2024/04/lets-talk-about-the-core-issue-of-saas-products-user-asset-security/</link>
		<comments>https://www.phppan.com/2024/04/lets-talk-about-the-core-issue-of-saas-products-user-asset-security/#comments</comments>
		<pubDate>Sat, 20 Apr 2024 09:17:18 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[架构和远方]]></category>
		<category><![CDATA[SaaS]]></category>
		<category><![CDATA[安全]]></category>

		<guid isPermaLink="false">http://www.phppan.com/?p=2193</guid>
		<description><![CDATA[2013 年，当年的互联网巨头雅虎遭受了历史上最大的数据泄露事件之一。据报道，有 30 亿个用户账户的信息被盗 [&#8230;]]]></description>
				<content:encoded><![CDATA[<section id="nice" style="color: #000000;" data-tool="mdnice编辑器" data-website="https://www.mdnice.com">
<p data-tool="mdnice编辑器">2013 年，当年的互联网巨头雅虎遭受了历史上最大的数据泄露事件之一。据报道，有 30 亿个用户账户的信息被盗，包括用户的姓名、电子邮件地址、电话号码、生日、密码等信息。这个安全漏洞的发生，严重损害了雅虎的品牌声誉，也导致了大量的法律诉讼，并对雅虎的业务造成了长期的负面影响。</p>
<p data-tool="mdnice编辑器">2017 年，美国大型信用评级机构 Equifax 也遭遇了严重的数据泄露，涉及到的用户资产包括了近1.5亿人的社保号码、出生日期、地址甚至驾驶执照。这个事件不仅对 Equifax 的声誉造成了重创，还引发了全球范围内对用户资产安全的关切。</p>
<p data-tool="mdnice编辑器">2018 年，Facebook 因为 Cambridge Analytica 数据滥用事件而受到了全球的关注。Cambridge Analytica 是一家政治数据分析公司，被发现非法获取了大约 8700 万 Facebook 用户的数据，然后用这些数据来影响选民行为。这个事件引发了全球对 Facebook 数据处理和隐私保护政策的广泛批评。</p>
<p data-tool="mdnice编辑器">在 SaaS 企业中，用户资产安全是一个需要特别关注的核心问题。</p>
<p data-tool="mdnice编辑器">本文将探讨用户资产的定义、用户资产安全的价值、如何做好用户资产安全、以及可能遇到的问题。</p>
<h1 data-tool="mdnice编辑器"><span class="content" style="color: #0e8aeb;">用户资产安全的定义</span></h1>
<p data-tool="mdnice编辑器">在讨论用户资产安全之前，我们首先需要明确什么是用户资产。</p>
<p data-tool="mdnice编辑器">用户资产，从广义上来讲，是指用户在使用一个产品或服务过程中产生和积累的所有数据和信息。这些资产包括但不限于用户的<strong style="color: #0e88eb;">个人信息</strong>（如姓名、电子邮件地址、电话号码等）、<strong style="color: #0e88eb;">交易信息</strong>（如购买记录、信用卡信息等）、<strong style="color: #0e88eb;">用户偏好和设置</strong>（如他们喜欢的产品类型、订阅的新闻类别、界面的颜色方案等）、<strong style="color: #0e88eb;">行为数据</strong>（如浏览记录、点击行为等）以及<strong style="color: #0e88eb;">用户创建的内容</strong>（如在 SaaS 产品、社交媒体发布他们自己的内容）。</p>
<p data-tool="mdnice编辑器">用户资产安全是指在整个数据生命周期内，对用户资产的机密性、完整性、可用性进行持续一致的保护，使其免受未经授权的访问、使用、泄露、篡改、损坏或丢失。</p>
<p data-tool="mdnice编辑器">简单来说，就是保护用户资产不被非法使用、泄露或损坏的过程和措施。它包括两个主要方面：一是保护用户资产的完整性和可用性，确保用户可以随时访问和使用他们的资产；二是保护用户资产的隐私和机密性，防止用户资产被未经授权的第三方获取和使用。</p>
<h1 data-tool="mdnice编辑器"><span class="content" style="color: #0e8aeb;">用户资产安全的价值</span></h1>
<p data-tool="mdnice编辑器">用户资产安全对于 SaaS 企业来说具有极其重要的战略价值。</p>
<p data-tool="mdnice编辑器">对于任何一家公司，尤其是 SaaS 公司，用户资产安全的重要性不言而喻。<strong style="color: #0e88eb;">用户信任是企业的生命线</strong>。</p>
<p data-tool="mdnice编辑器">对于用户来说，他们的个人信息、交易记录、内容创作等是非常隐私和敏感的资产。他们把这些资产托付给 SaaS 企业，是建立在对企业的信任基础之上的。如果企业能够很好地保护用户的资产安全，尊重用户隐私，就能建立良好的品牌形象，赢得用户的信任和忠诚度。反之，如果出现用户资产泄露事件，会严重损害企业的声誉，失去用户的信任，难以挽回。</p>
<p data-tool="mdnice编辑器">资产安全是用户使用 SaaS 服务的基本需求之一。没有安全保障，用户会对产品失去信心，从而影响使用体验和满意度。而且一旦发生资产泄露，用户要经历修改密码、更换绑定手机等一系列繁琐的安全措施，严重影响了体验。保障良好的资产安全，可以让用户更安心地使用产品，有更好的体验。</p>
<p data-tool="mdnice编辑器">对于用户资产安全，我们必须考虑到法律风险。目前，全球许多国家和地区都已经制定了严格的数据保护法规，例如欧盟的《通用数据保护条例》（GDPR），严格规范企业收集、存储、使用用户数据的行为。如果企业出现违规，<strong style="color: #0e88eb;">轻则面临高额罚款，重则可能被吊销营业执照</strong>。而且一旦发生资产泄露，企业还可能面临集体诉讼等法律风险。同时资产泄露还会给企业带来客户流失、营收下滑等经济损失，甚至被禁止运营。</p>
<p data-tool="mdnice编辑器">在高度竞争的市场环境中，保护用户资产的能力也可以成为我们的一大竞争优势。SaaS 企业通过服务用户，沉淀了大量有价值的用户资产，这是企业的核心资产之一。如果企业能够在确保安全合规的前提下，充分利用这些用户资产进行数据挖掘、分析，形成数据洞见，可以更好地了解用户，优化产品，指导决策，从而形成数据驱动的竞争优势。而这一切都建立在良好的用户资产安全的基础之上。</p>
<h1 data-tool="mdnice编辑器"><span class="content" style="color: #0e8aeb;">如何做好用户资产安全</span></h1>
<p data-tool="mdnice编辑器">对于 SaaS 企业来说，做好用户资产安全需要从组织、制度、技术、应急等多个维度来持续建设。</p>
<p data-tool="mdnice编辑器"><strong style="color: #0e88eb;">从组织层面</strong>，需要有正式或虚拟的组织来看着安全这个事情，而用户资产安全是其工作中重要的一块。这个组织的职责主要是负责制定和实施安全策略，协调跨部门的安全事务，且<strong style="color: #0e88eb;">安全的负责人需要向公司高层汇报</strong>。</p>
<p data-tool="mdnice编辑器"><strong style="color: #0e88eb;">从制度层面</strong>，制定全面的资产安全管理制度和流程，明确各部门和岗位的安全职责，并通过培训、考核等机制落实到位。制定和流程的构建是一个持续建设的事情，需要不停的迭代，在最开始的时候，如果有可能，找到对安全比较熟悉的同学，或者参考行业的一些做法，尽量制定一系列全面、严谨的安全管理制度和规范，并确保其得到有效执行，常见的制度如下：</p>
<ol data-tool="mdnice编辑器">
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">数据安全管理制度</strong>：明确数据的分类分级、采集、传输、存储、访问、使用、共享、销毁等各个环节的安全要求，对敏感数据要有更加严格的管控措施。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">访问控制管理制度</strong>：依据安全策略和业务需求，对信息系统、网络资源、数据库等的访问进行严格控制。细化到用户、角色、权限粒度，并遵循最小权限原则。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">身份认证管理制度</strong>：建立统一的身份认证体系，规范账号、口令的管理，强化口令复杂度要求。对于重要系统，实施多因素认证。并做好认证信息的保护。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">安全审计管理制度</strong>：对用户对敏感数据和关键资源的所有访问、操作行为进行详细记录，便于事后审计和问责。明确审计对象、内容、频次等要求。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">外包安全管理制度</strong>：针对外包人员接触企业信息资产的场景，在合同中明确安全职责，要求其遵守企业的安全管理规定，并承担相应责任。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">个人信息保护制度</strong>：严格遵守相关法律法规要求，制定个人信息收集、使用、委托处理等规则，保障用户的知情权、选择权等合法权益。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">安全事件管理制度</strong>：规范安全事件的发现、报告、分析、处置、恢复等环节的要求，确保一旦发生安全事件，能够快速响应、有序处置，将损失和影响降到最低。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">安全考核管理制度</strong>：将安全目标、责任落实到人，纳入绩效考核体系。对于违规行为要有相应的问责和惩戒措施。同时建立有效的奖惩机制，调动员工的安全积极性。</section>
</li>
</ol>
<p data-tool="mdnice编辑器">制度是做好用户资产安全管理的基础保障。要通过制度的约束和规范，将安全要求落地，固化到企业日常运营管理中，并通过定期评审、持续改进，使其与企业的安全策略、业务发展同步优化。</p>
<p data-tool="mdnice编辑器"><strong style="color: #0e88eb;">从技术层面</strong>，要做好用户资产安全管理，需要综合采取多种安全技术措施，构建一个纵深防御、多层级保护的安全体系。主要包括以下几个方面：</p>
<ol data-tool="mdnice编辑器">
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">数据加密</strong>：对敏感数据进行加密，包括静态数据的存储加密和动态数据的传输加密。选择安全、高效的加密算法，并做好密钥管理。特别是针对用户隐私数据，要遵循端到端加密原则。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">访问控制</strong>：实施严格的身份认证和授权机制，支持基于角色、属性的细粒度权限管理。采用多因素认证、单点登录等技术，增强身份确认的安全性。同时做好会话管理，防止越权访问。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">安全审计</strong>：部署全面的日志审计系统，对用户访问、操作等行为进行记录、分析，及时发现可疑行为。包括但不限于线上、管理后台等，有条件的公司可以利用大数据分析、机器学习等技术，实现智能化的行为审计和异常检测。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">数据脱敏</strong>：对非业务必需的敏感信息进行脱敏处理，如掩码、加密、数据变形等，在确保功能可用的前提下最小化敏感信息的暴露。尤其在开发、测试、培训等场景，要避免使用真实的用户数据。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">数据备份与恢复</strong>：俗话说：「<strong style="color: #0e88eb;">备份不做，日子甭过</strong>】，制定完善的数据备份策略，采用多副本、异地容灾等机制，确保数据的可靠性和可恢复性。定期进行数据备份和恢复演练，检验备份的有效性。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">网络安全防护</strong>：部署完善的网络安全防护设施，如防火墙、入侵检测/防御系统、Web应用防火墙等，提升系统抵御网络攻击的能力。对重要网络区域进行隔离，减少攻击面。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">主机与终端安全防护</strong>：加强服务器、数据库等关键资产的安全防护，及时修复漏洞，严格控制权限，审慎配置。加强员工终端的安全管理，推广使用防病毒、桌面管控等安全工具。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">安全监测与响应</strong>：建立实时的安全监测与预警机制，利用安全信息和事件管理（SIEM）、威胁情报等技术，快速发现和处置安全威胁。建设安全运营中心（SOC），提供7&#215;24小时的安全监测与响应。</section>
</li>
</ol>
<p data-tool="mdnice编辑器">用户资产安全管理需要从身份、权限、数据、网络、主机、监测等多个维度进行综合防护。同时还要重视新技术应用带来的安全风险。</p>
<p data-tool="mdnice编辑器">即使企业采取了再多的安全防护措施，也难以完全避免安全事件的发生。而一旦发生安全事件，如果没有完善的应急响应机制，可能导致用户资产的大量泄露或损毁，给企业和用户带来严重的损失。因此，构建完善的安全应急体系，是用户资产安全管理中不可或缺的一环。</p>
<p data-tool="mdnice编辑器">在行业内关于安全应急有一个比较泛的逻辑，主要应包括以下几个方面：</p>
<ol data-tool="mdnice编辑器">
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">成立安全应急响应团队</strong>：组建一支专业的安全应急响应团队，成员应包括安全、业务、法务、公关等多个部门的人员。明确各自的角色和职责，建立统一的指挥调度和协同机制。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">制定安全应急预案</strong>：针对可能发生的各类安全事件，如数据泄露、系统入侵、勒索攻击等，提前制定详细的应急预案。明确应急处置的流程、策略和措施，规范应急处置行为，确保应急响应的有序开展。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">开展应急演练</strong>：定期组织开展安全应急演练，模拟各种安全事件场景，检验应急预案的可行性和有效性。通过演练，磨合应急响应团队，提升应急处置能力，发现和改进应急机制中的不足。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">部署安全监测与预警</strong>：建立完善的安全监测与预警机制，利用各种安全工具和技术手段，实时监测系统和数据的安全状态，及时发现可疑行为和异常情况。同时做好安全事件的分级分类，建立安全预警的标准和阈值，做到早发现、早处置。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">开展安全事件调查和分析</strong>：当安全事件发生后，要及时开展详细的调查和分析，查明事件的起因、经过、影响范围等，评估损失程度。通过深入分析，找出安全管理中的薄弱环节，总结经验教训，制定整改措施，防范类似事件再次发生。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">做好安全事件的对外披露和沟通</strong>：当发生重大安全事件时，要及时、主动地对外披露和沟通，向监管部门报告，向用户和公众说明情况，消除不必要的疑虑和恐慌。同时做好舆情监测和引导，减少负面影响，维护企业形象。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">加强安全事件的追责和问责</strong>：对于导致安全事件发生的相关责任人，要进行严肃的追责和问责，形成有力的震慑。同时完善内部考核和奖惩机制，将安全责任落实到人，提高全员的安全意识和责任心。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">持续优化应急响应机制</strong>：通过总结安全事件的处置经验，持续改进和完善应急响应机制，优化应急预案和流程，补充应急资源和工具，提升应急处置效率和水平，构建长效的应急安全保障机制。</section>
</li>
</ol>
<p data-tool="mdnice编辑器">应急响应是用户资产安全管理的最后一道防线，只有建立完善、高效的安全应急体系，才能最大限度地减少安全事件对用户资产的影响，维护企业和用户的核心利益。应急不是被动的事后补救，而是安全管理的重要组成部分，需要<strong style="color: #0e88eb;">提前规划、持续优化</strong>，将应急处置能力打造成企业安全运营的核心竞争力。</p>
<h1 data-tool="mdnice编辑器"><span class="content" style="color: #0e8aeb;">用户资产安全可能遇到哪些问题</span></h1>
<p data-tool="mdnice编辑器">在落实和执行用户资产安全的过程中，SaaS 企业可能会遇到以下一些常见问题：</p>
<ol data-tool="mdnice编辑器">
<li>
<section style="color: #010101;">
<p style="color: #000000;"><strong style="color: #0e88eb;">安全投入与收益不平衡</strong>：安全投入从短期来看通常很难直接产生收益，更多是为了防范风险。但过多的安全投入又可能影响企业的投入产出比。因此企业需要平衡好安全投入与收益的关系，将有限资源用在刀刃上。</p>
</section>
</li>
<li>
<section style="color: #010101;">
<p style="color: #000000;"><strong style="color: #0e88eb;">安全与效率的平衡</strong>：安全管控通常会给企业内部人员带来一些不便，降低工作效率。比如严格的权限管控会使数据共享和协作变得困难。再如频繁的安全审计会给员工带来心理压力。因此需要在确保安全的同时尽量降低对员工效率的影响。</p>
</section>
</li>
<li>
<section style="color: #010101;">
<p style="color: #000000;"><strong style="color: #0e88eb;">部门协同与利益冲突</strong>：用户资产安全需要公司上下、部门之间通力合作，但在实际中可能存在部门墙、利益冲突等问题。如业务部门可能更关注业务指标，而忽视必要的安全要求。再如不同产品之间缺乏统一的安全标准。这就需要强有力的领导统筹和制度规范来协调一致。</p>
</section>
</li>
<li>
<section style="color: #010101;">
<p style="color: #000000;"><strong style="color: #0e88eb;">安全人才队伍建设</strong>：网络安全人才是稀缺资源，知识更新迭代快，优秀人才易流失。SaaS 企业可能面临安全人才短缺的困境。因此要重视安全人才的招聘、培养和留存，建设一支高素质、稳定的安全团队。</p>
</section>
</li>
<li>
<section style="color: #010101;">
<p style="color: #000000;"><strong style="color: #0e88eb;">供应链管理风险</strong>：企业自身的安全有可能很严密，但一些外包服务、第三方组件可能存在漏洞。尤其是现在普遍采用的 SaaS 服务，上游供应商的安全直接关系到企业自身。因此要加强供应链的安全管理，对合作伙伴有明确的安全要求和审计机制。</p>
</section>
</li>
<li>
<section style="color: #010101;">
<p style="color: #000000;"><strong style="color: #0e88eb;">安全合规的复杂性</strong>：不同国家和地区在用户隐私保护方面的法律存在差异，企业需要根据自己业务所在地调整安全策略，这增加了合规的复杂性。同时安全合规也在不断变化发展，需要企业持续跟踪和响应。</p>
</section>
</li>
</ol>
<p data-tool="mdnice编辑器">以上这些都是在保护用户资产时可能会遇到的挑战和问题。要有效地解决这些问题，需要有一个全面的安全策略，并且持续投入资源进行安全的维护和更新。</p>
<h1 data-tool="mdnice编辑器"><span class="content" style="color: #0e8aeb;">结语</span></h1>
<p data-tool="mdnice编辑器"><strong style="color: #0e88eb;">用户资产安全只有起点没有终点</strong>。SaaS 企业必须高度重视，从战略高度、全局视角来系统规划和持续建设。要坚持以用户为中心的理念，在合规、可控的前提下，充分利用数据创造更大价值。</p>
<p data-tool="mdnice编辑器">用户资产安全是一个复杂但至关重要的问题。作为 SaaS 公司，我们有责任保护用户的资产，通过理解用户资产，实施强大的安全策略，以及应对可能的问题，我们可以提供安全、可信赖的服务，赢得用户的信任，并推动业务的发展。</p>
</section>
]]></content:encoded>
			<wfw:commentRss>https://www.phppan.com/2024/04/lets-talk-about-the-core-issue-of-saas-products-user-asset-security/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>关于爬虫</title>
		<link>https://www.phppan.com/2023/12/about-web-crawlers/</link>
		<comments>https://www.phppan.com/2023/12/about-web-crawlers/#comments</comments>
		<pubDate>Sat, 16 Dec 2023 13:57:08 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[架构和远方]]></category>
		<category><![CDATA[安全]]></category>
		<category><![CDATA[技术]]></category>
		<category><![CDATA[爬虫]]></category>

		<guid isPermaLink="false">http://www.phppan.com/?p=2110</guid>
		<description><![CDATA[作为一个互联网的技术开发，爬虫不管是自己写的还是所负责的网站被爬，都是挺常见的。 但是一个很常见的东西，却一直 [&#8230;]]]></description>
				<content:encoded><![CDATA[<p style="color: #000000;" data-tool="mdnice编辑器">作为一个互联网的技术开发，爬虫不管是自己写的还是所负责的网站被爬，都是挺常见的。</p>
<p style="color: #000000;" data-tool="mdnice编辑器">但是一个很常见的东西，却一直没有系统梳理过，今天我们从发展历史，价值，问题和应对恶意爬虫的策略来聊一聊爬虫。</p>
<h1 style="color: #000000;" data-tool="mdnice编辑器"><span style="color: #0e88eb;">1 爬虫发展历史</span></h1>
<p style="color: #000000;" data-tool="mdnice编辑器">爬虫的发展历史伴随着搜索引擎的发展和大的搜索引擎公司的崛起，按时间线，大概分为三个阶段：</p>
<h2 style="color: #000000;" data-tool="mdnice编辑器"><span style="font-weight: bolder; color: #0e88eb;">1.1 90 年代的早期爬虫</span></h2>
<p style="color: #000000;" data-tool="mdnice编辑器">早期的爬虫主要用于<strong style="color: #0e88eb;">收集网页链接、测量互联网规模或提供搜索服务</strong>。它们的目标相对简单明确。它们基于文本的抓取和索引，大多数是单线程和顺序抓取，有着简单的去重策略和有限的抓取规模，且当时对爬虫行为的限制较少。以下为一些早期爬虫：</p>
<ul class="list-paddingleft-1" style="color: #000000;" data-tool="mdnice编辑器">
<li>
<section style="color: #010101;">World Wide Web Wanderer（1993年）：由麻省理工学院的 Matthew Gray 开发，World Wide Web Wanderer 是最早的网络爬虫之一。其是用 Perl 语言实现，最初的目的是测量互联网的规模，但随后它也开始收集网页的 URL，并将这些 URL 存储在名为 Wandex 的数据库中。</section>
</li>
<li>
<section style="color: #010101;">JumpStation（1993年）：Jonathon Fletcher 开发的 JumpStation 是一个早期的搜索引擎，被认为是世界上第一个网络搜索引擎，它使用一个基于爬虫的方法来收集链接并生成索引。JumpStation 利用简单的文本匹配技术来检索网页，并提供了一个基本的搜索界面。</section>
</li>
<li>
<section style="color: #010101;">RBSE (Rice-Based Search Engine) ：全名为 Rice-Based Search Engine，是由 Rice University 的 Ramin Zabih 和 Justin Boyan 开发的。RBSE 是一个基于网络爬虫的搜索引擎，它使用了一种名为 &#8220;backward link crawling&#8221; 的方法进行网络抓取。该方法首先找到某个已知的相关网页，然后通过跟踪这个网页的反向链接（即指向该网页的其他网页）来查找更多的相关内容。</section>
</li>
<li>
<section style="color: #010101;">WebCrawler（1994年）：WebCrawler 是由 Brian Pinkerton 开发的，它是第一个全文搜索引擎。WebCrawler 使用爬虫抓取网页，并将收集到的数据存储在索引服务器上。用户可以通过搜索关键词找到相关网页。</section>
</li>
<li>
<section style="color: #010101;">Lycos（1994年）：Lycos 是另一个使用爬虫技术的搜索引擎，由卡内基梅隆大学的 Michael Mauldin 开发。Lycos 成为了当时最大的搜索引擎之一，提供了更先进的搜索功能和更大的索引。</section>
</li>
</ul>
<h2 style="color: #000000;" data-tool="mdnice编辑器"><span style="font-weight: bolder; color: #0e88eb;">1.2 搜索引擎时代的爬虫（90 年代末至 2000 年代初）</span></h2>
<p style="color: #000000;" data-tool="mdnice编辑器">与早期爬虫相比，搜索引擎时代的爬虫已经支持了分布式抓取，支持多种文件类型和媒体格式，需要采用更复杂的网页解析技术，并且要遵守网站抓取规则，另外，在去重，索引和隐私保护等方面有了长足的长进。此时的爬虫，<strong style="color: #0e88eb;">共同致力于提供更快速、更准确、更全面的搜索结果</strong>，满足用户不断增长的信息需求。以下为一些示例：</p>
<ul class="list-paddingleft-1" style="color: #000000;" data-tool="mdnice编辑器">
<li>
<section style="color: #010101;">Scooter（1995 年）：Scooter 是用于 AltaVista 公共搜索引擎的网络爬虫，AltaVista 曾声称Scooter 是「当今最快的网络爬虫」。它负责抓取和索引网页以构建 AltaVista 的搜索结果。</section>
</li>
<li>
<section style="color: #010101;">Yandex Bot（1997年）：Yandex Bot 是俄罗斯搜索引擎 Yandex 的网络爬虫。它通过抓取和索引网页来构建 Yandex 的搜索结果。Yandex 使用了一种称为 MatrixNet 的机器学习算法来评估网页的质量和相关性。</section>
</li>
<li>
<section style="color: #010101;">Googlebot（1998年）：Googlebot 与 Google 搜索引擎一起诞生。Google 的创始人拉里·佩奇（Larry Page）和谢尔盖·布林（Sergey Brin）于 1996 年开始研究他们的搜索引擎项目，最终在 1998 年正式推出 Google 搜索引擎。Googlebot 是 Google 搜索引擎的网络爬虫。它按照一定的算法和策略抓取互联网上的网页，用于构建 Google 的搜索索引。Googlebot 使用了一种称为 PageRank 的链接分析算法来评估网页的相关性和重要性。</section>
</li>
<li>
<section style="color: #010101;">Bingbot（2006年）：Bingbot 是微软旗下搜索引擎 Bing 的网络爬虫。它通过抓取和索引网页来构建 Bing 的搜索结果。Bingbot 采用了一种称为 TrustRank 的算法来评估网页的质量和可信度。</section>
</li>
<li>
<section style="color: #010101;">Baiduspider（2000年）：Baiduspider 是中国搜索引擎百度的网络爬虫。它负责抓取和索引互联网上的中文网页，用于构建百度的搜索结果。百度爬虫使用了一种称为 LinkRank 的链接分析算法。</section>
</li>
<li>
<section style="color: #010101;">DuckDuckBot（2008年）：DuckDuckBot 是以隐私保护著称的搜索引擎 DuckDuckGo 的网络爬虫。虽然 DuckDuckGo 在很大程度上依赖于其他搜索引擎的结果，但它也使用自己的爬虫来抓取和索引网页。</section>
</li>
</ul>
<h2 style="color: #000000;" data-tool="mdnice编辑器"><span style="font-weight: bolder; color: #0e88eb;">1.3 现代爬虫</span></h2>
<p style="color: #000000;" data-tool="mdnice编辑器">随着互联网的快速发展，爬虫技术也在不断进步。一方面，搜索引擎公司继续改进爬虫技术，以提高搜索结果的质量和速度。另一方面，爬虫技术已经成为数据挖掘、竞争情报和市场研究等领域的重要工具。</p>
<p style="color: #000000;" data-tool="mdnice编辑器">随着编程语言和开源项目的发展，现在有许多成熟的爬虫框架和库，如 Scrapy、Beautiful Soup、Puppeteer 和 Selenium 等。这些工具使得开发人员可以更容易地创建爬虫程序，以满足各种数据抓取需求。</p>
<p style="color: #000000;" data-tool="mdnice编辑器">在爬虫的发展历史中有一个不是规范的规范是一定要讲一下的，那就是 robots.txt 规范。</p>
<p style="color: #000000;" data-tool="mdnice编辑器">robots.txt 并不是一个实际的规范，而只是约定俗成的，其并不能真正保证网站的隐私，有点防君子不防小人的味道。</p>
<p style="color: #000000;" data-tool="mdnice编辑器">它的由来可以追溯到 1994 年，当时互联网上的 Web 页面数量急剧增加，导致许多搜索引擎和网络爬虫竞相抓取这些内容。然而，不是每个网站都希望被这些网络爬虫抓取和索引。并且，网络爬虫可能消耗大量的服务器资源，影响网站的性能和用户体验。为了解决这个问题，一个荷兰计算机科学家 Martijn Koster 提出了一种简单的解决方案：在网站的根目录下放置一个名为 robots.txt 的文本文件，用来告诉网络爬虫哪些页面可以抓取，哪些不可以。robots.txt 的提出得到了搜索引擎和网络爬虫开发者的广泛支持，逐渐成为了事实上的行业标准。</p>
<p style="color: #000000;" data-tool="mdnice编辑器">大多数网络爬虫在访问一个网站之前都会检查 robots.txt 文件，以确定哪些内容可以抓取，哪些需要避免。需要注意的是，robots.txt 文件并没有法律约束力，恶意爬虫可能会忽略它的规则。</p>
<h1 style="color: #000000;" data-tool="mdnice编辑器"><span style="color: #0e88eb;">2 爬虫的价值和问题</span></h1>
<h2 style="color: #000000;" data-tool="mdnice编辑器"><span style="font-weight: bolder; color: #0e88eb;">2.1 爬虫的价值</span></h2>
<p style="color: #000000;" data-tool="mdnice编辑器">爬虫，作为一种自动遍历、抓取和分析网页内容的技术，为互联网中的信息获取、数据分析和知识发现提供了重要支持。其价值可以分为以下 4 类：</p>
<ol class="list-paddingleft-1" style="color: #000000;" data-tool="mdnice编辑器">
<li>
<section style="color: #010101;">
<p style="color: black;"><strong style="color: #0e88eb;">信息获取与索引</strong></p>
</section>
<ul class="list-paddingleft-1">
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">搜索引擎索引</strong>：网络爬虫是搜索引擎构建其索引的关键组件。通过抓取和分析网页的内容、结构和链接信息，爬虫帮助搜索引擎构建一个全面、实时的网页数据库，从而为用户提供准确、相关的搜索结果。</section>
</li>
</ul>
</li>
<li>
<section style="color: #010101;">
<p style="color: black;"><strong style="color: #0e88eb;">数据分析与挖掘</strong></p>
</section>
<ul class="list-paddingleft-1">
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">数据挖掘和分析</strong>：爬虫可以用于从互联网上收集大量数据，如新闻、论坛、博客、评论等。这些数据可以用于进一步的数据挖掘和分析，以发现潜在的趋势、模式和关联，为市场研究、竞争分析、舆情监控等应用提供有价值的洞察。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">内容监测</strong>：爬虫可以用于定期监测网站的内容变化，如新闻发布、产品更新、政策变动等。这有助于及时获取最新信息，为用户和企业提供实时的情报和提醒。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">学术研究</strong>：网络爬虫在学术研究中具有重要价值。研究人员可以使用爬虫抓取特定主题或领域的数据，进行进一步的分析和挖掘，以揭示潜在的知识和洞见。</section>
</li>
</ul>
</li>
<li>
<section style="color: #010101;">
<p style="color: black;"><strong style="color: #0e88eb;">数据整合与应用</strong></p>
</section>
<ul class="list-paddingleft-1">
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">数据抓取和整合</strong>：爬虫可以用于抓取和整合来自不同来源的数据，如价格、产品规格、库存、评价等。这些数据可用于搭建价格比较网站、产品推荐系统、库存管理系统等，帮助用户和企业做出更明智的决策。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">知识图谱构建</strong>：通过抓取和分析大量的结构化和非结构化数据，爬虫可以帮助构建知识图谱，捕捉实体之间的关系和属性。知识图谱可用于支持语义搜索、问答系统、推荐系统等智能应用。</section>
</li>
</ul>
</li>
<li>
<section style="color: #010101;">
<p style="color: black;"><strong style="color: #0e88eb;">备份与存档</strong></p>
</section>
<ul class="list-paddingleft-1">
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">存档和数据备份</strong>：网络爬虫可以用于抓取和备份网站的内容，为网页存档项目（如互联网档案馆）提供数据。这可以帮助保留历史信息，供未来的研究和回顾。</section>
</li>
</ul>
</li>
</ol>
<h2 style="color: #000000;" data-tool="mdnice编辑器"><span style="font-weight: bolder; color: #0e88eb;">2.2 爬虫的问题</span></h2>
<p style="color: #000000;" data-tool="mdnice编辑器">在有价值的同时，爬虫也会产生一些问题，这些问题分为两方，一个是对于爬虫发起方，另一个是对于爬虫接受方。</p>
<h3 data-tool="mdnice编辑器">2.2.1 发起方的问题</h3>
<p style="color: #000000;" data-tool="mdnice编辑器">对于发起方而言，可能有如下的问题：</p>
<ol class="list-paddingleft-1" style="color: #000000;" data-tool="mdnice编辑器">
<li>
<section style="color: #010101;">
<p style="color: black;"><strong style="color: #0e88eb;">技术挑战</strong></p>
</section>
<ul class="list-paddingleft-1">
<li>
<section style="color: #010101;">动态页面抓取：现代网站普遍采用 JavaScript、AJAX、SPA 等技术，传统的基于静态 HTML 的爬虫难以获取这些数据。例如，网站上的评论区可能是通过 AJAX 动态加载的，传统的爬虫无法直接抓取这些评论内容。</section>
</li>
<li>
<section style="color: #010101;">反爬虫措施：许多网站采用各种反爬虫措施，如验证码、IP 限制、Cookie 跟踪等，使得爬虫难以访问和抓取目标数据。例如，购物网站可能会要求用户输入验证码才能查看商品价格，这对爬虫构成了挑战。</section>
</li>
<li>
<section style="color: #010101;">网页结构变化：网站经常更新布局和设计，导致爬虫需要不断地适应这些变化。例如，一个新闻网站可能会在某次更新后改变文章标题的 HTML 标签，使得原来的爬虫无法正确抓取标题信息。</section>
</li>
</ul>
</li>
<li>
<section style="color: #010101;">
<p style="color: black;"><strong style="color: #0e88eb;">道德与法律问题</strong></p>
</section>
<ul class="list-paddingleft-1">
<li>
<section style="color: #010101;">隐私侵犯：在抓取用户信息、社交媒体动态等数据时，可能会涉及到用户隐私。例如，一个爬虫可能会抓取用户在社交媒体上的地理位置信息，进而侵犯用户的隐私权。</section>
</li>
<li>
<section style="color: #010101;">知识产权侵权：爬虫在抓取内容时可能会触犯知识产权，如未经授权转载的文章、图片、音频等。例如，一个爬虫可能会抓取并转载一篇受版权保护的新闻报道，导致版权纠纷。</section>
</li>
<li>
<section style="color: #010101;">法律法规遵守：爬虫在抓取数据时要遵守相关法律法规，如不得抓取违法信息、遵循 robots.txt 协议等。例如，一个爬虫可能会抓取到违反法规的虚假广告，导致法律问题。</section>
</li>
</ul>
</li>
<li>
<section style="color: #010101;">
<p style="color: black;"><strong style="color: #0e88eb;">数据质量问题</strong></p>
</section>
<ul class="list-paddingleft-1">
<li>
<section style="color: #010101;">数据准确性：爬虫抓取的数据可能存在错误、失真、过时等问题。例如，一个爬虫可能因为网站结构变化而抓取到错误的商品价格信息，导致后续分析和应用出现问题。</section>
</li>
<li>
<section style="color: #010101;">数据完整性：爬虫抓取的数据可能不完整，无法涵盖所有相关信息。例如，一个用于舆情监控的爬虫可能仅抓取了部分新闻网站的报道，导致分析结果偏颇。</section>
</li>
</ul>
</li>
<li>
<section style="color: #010101;">
<p style="color: black;"><strong style="color: #0e88eb;">资源问题</strong></p>
</section>
<ul class="list-paddingleft-1">
<li>
<section style="color: #010101;">存储和计算资源：爬虫需要消耗大量的存储和计算资源来处理抓取到的数据。例如，一个爬虫可能需要存储数 TB 的网页内容，并对其进行文本分析、图像识别等计算密集型任务，这可能导致存储和计算资源不足。</section>
</li>
</ul>
</li>
</ol>
<p style="color: #000000;" data-tool="mdnice编辑器">以上是对爬虫发起方的挑战或问题，对于爬虫接受方面来说，这里可能的问题又分为两个方面，一个是正常的爬虫，如搜索引擎的爬虫，另一个是恶意爬虫。</p>
<h3 data-tool="mdnice编辑器">2.2.2 正常爬虫对网站产生的问题</h3>
<p style="color: #000000;" data-tool="mdnice编辑器">正常爬虫指的是遵循道德和法律规定，尊重网站权益的爬虫。尽管正常爬虫的目的通常是合理、合法的，但它们仍然可能给被爬网站带来一定的问题：</p>
<ul class="list-paddingleft-1" style="color: #000000;" data-tool="mdnice编辑器">
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">有限的服务器压力与带宽消耗</strong>：正常爬虫在抓取数据时也会占用服务器资源和带宽，尽管通常不会对网站造成严重影响。合理的爬虫应遵循网站的 robots.txt 文件设置，限制抓取速度，以减轻对服务器的压力。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">误抓取敏感信息</strong>：正常爬虫在抓取数据时可能会误抓取到一些敏感信息，如用户个人信息、电子邮件地址等。为了保护用户隐私，爬虫开发者应尽量避免抓取这类数据，或者在数据处理过程中对敏感信息进行脱敏处理。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">数据准确性与完整性</strong>：正常爬虫抓取的数据可能存在错误、失真、过时等问题。例如，网站结构变化可能导致爬虫抓取到错误的数据。为了确保数据质量，爬虫开发者需要不断更新和优化爬虫策略。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">无意识的知识产权侵权</strong>：正常爬虫在抓取网站内容时可能会无意识地触及知识产权问题。为了避免侵权，爬虫开发者应尽量获取授权，或者仅抓取公开可用、非受版权保护的数据。</section>
</li>
</ul>
<h3 data-tool="mdnice编辑器">2.2.3 恶意爬虫对网站产生的问题</h3>
<p style="color: #000000;" data-tool="mdnice编辑器">恶意爬虫指的是未经授权或者违反网站规定，采用不道德、非法手段抓取数据的爬虫。恶意爬虫可能给被爬网站带来以下问题：</p>
<ul class="list-paddingleft-1" style="color: #000000;" data-tool="mdnice编辑器">
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">服务器压力与带宽消耗</strong>：恶意爬虫可能在短时间内对网站发起大量请求，导致服务器负载过高，甚至引发服务器崩溃，<strong style="color: #0e88eb;">导致正常客户不可用</strong>。此外，大量请求会消耗网站的带宽资源，影响其他用户的访问速度。带宽的增加会带来<strong style="color: #0e88eb;">目标网站技术成本的急剧增加</strong>。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">数据隐私与安全</strong>：恶意爬虫可能窃取网站的敏感数据，如用户个人信息、登录凭证等。这种行为会侵犯用户隐私，甚至可能导致数据泄露、身份盗用等安全问题。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">知识产权侵权</strong>：恶意爬虫可能未经授权抓取并转载受版权保护的内容，如文章、图片、音频等。这种行为侵犯了网站及作者的知识产权，可能导致法律纠纷。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">网站安全漏洞利用</strong>：恶意爬虫可能会利用网站的安全漏洞进行攻击，如 SQL 注入、跨站脚本攻击等。这种行为会影响网站的数据安全和用户隐私。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">不良竞争</strong>：商业竞争对手可能使用恶意爬虫来抓取网站的数据，如产品信息、价格、促销活动等。这种行为可能导致不公平竞争，影响被爬网站的市场地位和利润。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">无效内容或账号滥用</strong>：爬虫可能会在网站上发布大量无意义的内容，以达到其目的，如影响内容搜索或排名，并且这些内容需要不同的假账号进行操作，这会对网站的账号体系产生较多的垃圾数据。</section>
</li>
</ul>
<h1 style="color: #000000;" data-tool="mdnice编辑器"><span style="color: #0e88eb;">3 应对爬虫的问题</span></h1>
<p style="color: #000000;" data-tool="mdnice编辑器">可以看到正常的爬虫的问题还能接受，但是针对恶意爬虫我们要打起十二分的精神，以防止其对我们网站的破坏。通过以下的一些手段我们可以缓解或者在一定程度上解决恶意爬虫的问题。</p>
<h2 style="color: #000000;" data-tool="mdnice编辑器"><span style="font-weight: bolder; color: #0e88eb;">3.1 应对正常爬虫</span></h2>
<p style="color: #000000;" data-tool="mdnice编辑器">为了 SEO 的效果我们有时还需要给爬虫提供一些帮忙，以下为一些常见的措施：</p>
<ul class="list-paddingleft-1" style="color: #000000;" data-tool="mdnice编辑器">
<li>
<section style="color: #010101;">
<p style="color: black;"><strong style="color: #0e88eb;">设置robots.txt文件</strong>：通过设置robots.txt文件，可以指导合规爬虫遵循规则，限制其访问特定目录或页面。这有助于减轻服务器负担，同时允许搜索引擎等合规爬虫正常抓取数据。</p>
</section>
</li>
<li>
<section style="color: #010101;">
<p style="color: black;"><strong style="color: #0e88eb;">限制爬虫抓取速度或增加服务器</strong>：在robots.txt文件中设置 Crawl-delay 参数，来控制爬虫抓取速度。这有助于降低服务器压力，确保网站正常运行。当然，我们也可以不限制其速度，通过增加服务器等措施提供更好的爬取体现。</p>
</section>
</li>
<li>
<section style="color: #010101;">
<p style="color: black;"><strong style="color: #0e88eb;">为爬虫提供 Sitemap</strong>：提供 Sitemap 文件，列出网站的所有页面 URL，帮助爬虫更高效、准确地抓取网站内容。这有助于提高网站在搜索引擎中的排名。</p>
</section>
</li>
<li>
<section style="color: #010101;">
<p style="color: black;"><strong style="color: #0e88eb;">优化网站结构</strong>：确保网站的链接结构清晰、合理，有助于爬虫更容易地抓取到所有页面。同时，遵循良好的 SEO 实践，提高网站在搜索引擎中的表现。</p>
</section>
</li>
<li>
<section style="color: #010101;">
<p style="color: black;"><strong style="color: #0e88eb;">监控服务器日志</strong>：定期检查服务器日志，分析爬虫的抓取行为，确保它们遵循 robots.txt 规则。如果发现不遵循规则的爬虫，可以采取相应的措施限制其访问。</p>
</section>
</li>
<li>
<section style="color: #010101;">
<p style="color: black;"><strong style="color: #0e88eb;">与爬虫开发者和维护者沟通</strong>：如果发现爬虫存在问题或给网站带来压力，可以尝试与爬虫开发者和维护者进行沟通，寻求合作解决问题。如网站提供的数据有较大需求，可以考虑为爬虫提供 API 接口。这有助于减轻服务器压力，同时提供更为规范、易于维护的数据访问方式。</p>
</section>
</li>
<li>
<section style="color: #010101;">
<p style="color: black;"><strong style="color: #0e88eb;">使用CDN服务</strong>：采用内容分发网络（CDN）服务，可以有效分散流量，降低单个服务器的压力。提升爬虫的爬取体验。</p>
</section>
</li>
</ul>
<h2 style="color: #000000;" data-tool="mdnice编辑器"><span style="font-weight: bolder; color: #0e88eb;">3.2 应对恶意爬虫</span></h2>
<p style="color: #000000;" data-tool="mdnice编辑器">恶意爬虫的出发点是利用非法手段获取利益或损害他人利益。主要源于网络攻击者、竞争对手等方面的需求，以获取敏感信息、窃取知识产权或增加目标网站的运营压力等等。</p>
<p style="color: #000000;" data-tool="mdnice编辑器">为应对恶意爬虫，我们有如下一些常见的策略或方法来应对。</p>
<ul class="list-paddingleft-1" style="color: #000000;" data-tool="mdnice编辑器">
<li>
<section style="color: #010101;">
<p style="color: black;"><strong style="color: #0e88eb;">限制请求频率</strong>：监控来自单个 IP 地址的请求频率。如果请求频率过高，可能是恶意爬虫。可以限制该 IP 地址的访问速度，或者暂时封锁它，以防止恶意抓取。频率限制中可以是分钟限，时限或日限。</p>
</section>
</li>
<li>
<section style="color: #010101;">
<p style="color: black;"><strong style="color: #0e88eb;">检查 User-Agent</strong>：检查请求的 User-Agent 字段，以识别恶意爬虫。某些恶意爬虫可能会使用非标准或可疑的 User-Agent。可以设置规则，要求访问者使用合法的浏览器 User-Agent。这块很常见，最开始的对抗中用这种方案比较容易见效，但是很快就可能破解。</p>
</section>
</li>
<li>
<section style="color: #010101;">
<p style="color: black;"><strong style="color: #0e88eb;">使用 Cookie 和 Session</strong>：通过使用 Cookie 和 Session 机制，可以跟踪访问者的行为。恶意爬虫可能在短时间内访问大量页面，而正常用户的访问模式通常不同。可以通过分析访问模式来识别并阻止恶意爬虫。其本质上的逻辑是区分正常用户和爬虫以及增加爬虫抓取数据的难度。通常情况下，正常用户访问网站时，服务端会为其生成一个唯一的 Session，并将 Session ID 存储在用户浏览器的 Cookie 中。当用户再次访问网站时，浏览器会将 Cookie 中的 Session ID 发送给服务端，以便服务端识别用户。而爬虫程序通常不会像浏览器那样自动处理 Cookie，因此通过检查请求中是否包含有效的 Cookie 和 Session ID，可以在一定程度上区分正常用户和爬虫。当然，对于恶意爬虫来说，可以绕过 Cookie 和 Session 的检测，此时就需要模拟浏览器的行为，包括处理 Cookie、维护 Session 等，这就大大增加了爬虫编写和运行的复杂性。此外，服务端还可以对 Cookie 和 Session 进行加密、设置过期时间等，做一些策略或措施，进一步提高爬虫绕过检测的难度。</p>
</section>
</li>
<li>
<section style="color: #010101;">
<p style="color: black;"><strong style="color: #0e88eb;">启用验证码</strong>：对于敏感操作或疑似恶意爬虫的访问，可以要求用户输入验证码（如 Google 的 reCAPTCHA）。这有助于阻止自动化的爬虫访问，但可能会对正常用户造成一定的不便。在检测到访问频率异常、异常访问行为、IP黑名单或者一些敏感操作、写操作时，可以启用验证码，此时我们需要权衡安全性和用户体验之间的平衡，网站应根据实际情况选择合适的启用验证码的时机，以尽量减少对用户的打扰。另外，在实施验证码方案时，考虑用户友好性。例如，确保验证码易于阅读和理解，同时提供无障碍访问选项（如语音验证码或替代验证方法），以满足不同用户的需求。</p>
</section>
</li>
<li>
<section style="color: #010101;">
<p style="color: black;"><strong style="color: #0e88eb;">动态加载内容</strong>：使用前端技术动态加载页面内容，使得恶意爬虫更难抓取数据。这种方法可能会影响网站的可访问性和 SEO，因此需要权衡后决策。</p>
</section>
</li>
<li>
<section style="color: #010101;">
<p style="color: black;"><strong style="color: #0e88eb;">保护 API</strong>：如果网站提供 API，可以对其添加额外的安全措施，如使用 API 密钥、限制请求速率和使用 OAuth 等身份验证机制。</p>
</section>
</li>
<li>
<section style="color: #010101;">
<p style="color: black;"><strong style="color: #0e88eb;">监控日志和异常行为</strong>：定期检查服务器日志，以发现异常访问模式，这有助于及时识别并应对恶意爬虫。最好有成体系的机制来保证，或者基于这些日志做一些监控告警，以系统化的方式更快的发现问题。</p>
</section>
</li>
<li>
<section style="color: #010101;">
<p style="color: black;"><strong style="color: #0e88eb;">采用 Web 应用防火墙（WAF）</strong>：当前面的一些简单策略不行，此时如果你正在使用云服务，可以使用 Web 应用防火墙（WAF）帮助识别和阻止恶意流量。Web 应用防火墙（Web Application Firewall，简称 WAF）是一种保护 Web 应用程序免受恶意攻击和其他安全威胁的解决方案。WAF 位于 Web 应用程序和互联网之间，它监视、过滤或阻止传入 Web 应用程序的 HTTP 流量。WAF 的核心功能是识别并阻止来自外部攻击者的恶意请求，从而保护 Web 应用程序的安全。WAF 可以提供如下一些方法，以帮助识别和阻止恶意爬虫，从而保护 Web 应用程序和数据。</p>
</section>
<ul class="list-paddingleft-1">
<li>
<section style="color: #010101;">
<p style="color: black;"><strong style="color: #0e88eb;">IP 地址筛选</strong>：WAF 可以通过识别和阻止来自已知恶意 IP 地址的请求来应对恶意爬虫。咱们可以维护一个恶意 IP 地址的黑名单，并将其添加到 WAF 的访问控制列表中，以阻止这些 IP 地址的请求。</p>
</section>
</li>
<li>
<section style="color: #010101;">
<p style="color: black;"><strong style="color: #0e88eb;">请求速率限制</strong>：WAF 可以限制特定 IP 地址或客户端在给定时间段内发出的请求数量，从而防止爬虫对您的 Web 应用程序发起过多的请求。通过设置合理的速率限制，可以在不影响正常用户访问的情况下，抵御恶意爬虫的攻击。</p>
</section>
</li>
<li>
<section style="color: #010101;">
<p style="color: black;"><strong style="color: #0e88eb;">请求头分析</strong>：WAF 可以分析 HTTP 请求头中的信息（如 User-Agent、Referer 等），以识别和阻止恶意爬虫。恶意爬虫通常使用特定的 User-Agent 字符串或发送不包含 Referer 的请求。您可以根据这些特征创建 WAF 规则，以阻止这些请求。</p>
</section>
</li>
<li>
<section style="color: #010101;">
<p style="color: black;"><strong style="color: #0e88eb;">请求异常检测</strong>：WAF 可以检测到异常请求，如请求频率异常、请求路径异常或请求参数异常等。一旦检测到异常请求，WAF 可以采取相应的措施，如阻止请求、要求输入验证码或增加请求延迟等。</p>
</section>
</li>
<li>
<section style="color: #010101;">
<p style="color: black;"><strong style="color: #0e88eb;">自定义 WAF 规则</strong>：咱们可以根据 Web 应用程序和业务需求创建自定义 WAF 规则，以更有效地识别和阻止恶意爬虫。例如，咱们可以创建规则来检测特定的攻击模式、请求路径或查询参数等。</p>
</section>
</li>
<li>
<section style="color: #010101;">
<p style="color: black;"><strong style="color: #0e88eb;">机器学习和行为分析</strong>：一些高级的 WAF 解决方案采用了机器学习和行为分析技术，以更准确地识别恶意爬虫。通过分析大量的请求数据，机器学习模型可以自动识别异常行为并更新 WAF 规则，从而更有效地阻止恶意爬虫。</p>
</section>
</li>
<li>
<section style="color: #010101;">
<p style="color: black;"><strong style="color: #0e88eb;">集成第三方服务</strong>：WAF 可以与其他安全服务和解决方案集成，以提高对恶意爬虫的防护能力。例如，您可以集成 IP 信誉数据库、威胁情报平台或验证码服务等，以提高 WAF 的效果。</p>
</section>
</li>
</ul>
</li>
</ul>
<p style="color: #000000;" data-tool="mdnice编辑器">WAF 的策略和我们前面讲的策略区别不大，只不过依赖于其背后的研发能力、资源和大样本量，能够发现更多的异常情况，有更多的策略和方法来识别，并且只需要投入少量的研发人力做自定义规则配置。</p>
<h1 style="color: #000000;" data-tool="mdnice编辑器"><span style="color: #0e88eb;">4 更有挑战的爬虫</span></h1>
<p style="color: #000000;" data-tool="mdnice编辑器">爬虫也是在不断演化和发展的，现在的爬虫技术面临的问题或研究的方向可能有如下的一些：</p>
<ul class="list-paddingleft-1" style="color: #000000;" data-tool="mdnice编辑器">
<li>
<section style="color: #010101;">
<p style="color: black;"><strong style="color: #0e88eb;">智能爬虫</strong>：随着网页结构和内容的日益复杂，智能爬虫技术成为一个研究热点。智能爬虫可以自动识别网页内容，理解结构化和非结构化数据，以更高效和准确地获取有价值的信息。这里是否可以结合最近的大模型来做一些工作？</p>
</section>
</li>
<li>
<section style="color: #010101;">
<p style="color: black;"><strong style="color: #0e88eb;">反爬虫策略和反反爬虫技术</strong>：许多网站采用反爬虫策略防止数据被抓取。研究者关注如何在尊重网站隐私和合规的前提下，开发更有效的反反爬虫技术，实现对网页内容的友好抓取。</p>
</section>
</li>
<li>
<section style="color: #010101;">
<p style="color: black;"><strong style="color: #0e88eb;">增量爬取和实时抓取</strong>：随着互联网信息的快速更新，增量爬取和实时抓取成为爬虫研究的重要方向。研究者试图通过优化爬取策略、调度算法、抓取频率等，实现更高效的增量爬取和实时抓取。</p>
</section>
</li>
<li>
<section style="color: #010101;">
<p style="color: black;"><strong style="color: #0e88eb;">分布式爬虫和大规模数据抓取</strong>：为应对大规模数据抓取的挑战，研究者关注分布式爬虫技术的优化和发展。分布式爬虫可以在多台计算机上并行运行，提高抓取速度和效率，降低单点故障的风险。</p>
</section>
</li>
<li>
<section style="color: #010101;">
<p style="color: black;"><strong style="color: #0e88eb;">深度网络爬虫</strong>：深度网络爬虫是指能够抓取隐藏在表单、登录、动态内容等复杂场景下的数据。研究者关注如何使用机器学习、自然语言处理等技术，提高深度网络爬虫的抓取能力和准确性。</p>
</section>
</li>
<li>
<section style="color: #010101;">
<p style="color: black;"><strong style="color: #0e88eb;">语义爬虫</strong>：语义爬虫关注如何从网页中自动抽取结构化数据和语义信息。通过使用知识图谱、本体建模等技术，语义爬虫可以更好地理解和表示网页内容，为语义搜索、智能问答等应用提供支持。</p>
</section>
</li>
<li>
<section style="color: #010101;">
<p style="color: black;"><strong style="color: #0e88eb;">针对特定领域的爬虫研究</strong>：不同领域的网站具有特定的结构和内容特征。研究者关注如何针对特定领域（如电子商务、社交媒体、学术研究等）设计和优化爬虫技术，以更好地满足不同场景下的数据抓取需求。</p>
</section>
</li>
</ul>
<p style="color: #000000;" data-tool="mdnice编辑器">对于现在的搜索引擎来说，这些应该都是在一定程度上解决了的问题，或者正在解决和优化的问题，为了其业务的发展，他们致力于发展更高效、智能、可扩展的爬虫技术，以应对互联网信息获取和分析的日益复杂需求。</p>
]]></content:encoded>
			<wfw:commentRss>https://www.phppan.com/2023/12/about-web-crawlers/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>安全？安全！安全！！</title>
		<link>https://www.phppan.com/2011/01/safe/</link>
		<comments>https://www.phppan.com/2011/01/safe/#comments</comments>
		<pubDate>Fri, 28 Jan 2011 01:33:56 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[PHP安全]]></category>
		<category><![CDATA[安全]]></category>

		<guid isPermaLink="false">http://www.phppan.com/?p=1232</guid>
		<description><![CDATA[安全？安全！安全！！ 在某日下班后，回家的路上，一个人走，走着走着，忽然我的手碰到了另一支手，艳遇？扭头！发现 [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>安全？安全！安全！！<br />
在某日下班后，回家的路上，一个人走，走着走着，忽然我的手碰到了另一支手，艳遇？扭头！发现一新疆美男在左顾右盼。然而我背的包已经被拉开了一半。好险，我的kindle，钱包都在包里。</p>
<p>年关将近，是该注意安全了。特别是回家的路上，请各位兄弟照顾好贵重物品和老婆，防火防盗啊！</p>
<p>好吧，言归正转。我们还是说说我们在开发中的安全问题吧。</p>
<p>这里我们从一次PHP请求过程来说明一些常见的安全问题。</p>
<p><strong>【从客户端到服务器应用层】</strong><br />
每次用户的请求都会先通过客户端发起请求，然后服务器接收请求并处理这个请求。<br />
如果我们在客户端有验证（如必须输入用户名之类的），此时我们除了在客户端验证外，更重要的是在服务器的应用层进行验证（所有的验证必须在服务器有一份）。这些验证包括不能为空，输入内容的长度，输入内容的类型等。如果确定为数字型，可以考虑将其转化为数字类型后使用。<br />
为什么要这样做呢？因为我们不相信客户端，也不相信客户端的验证。在某些情况下，对于用户输入的数据，我们不仅仅是过滤，在必要的时候可能需要直接提示用户输入错误。<br />
如果我们在实际项目中要做类似于投票的功能，需要对用户进行限制，常规的，ip,验证码等。除此之外，如果是基于某个已有应用，并且这个应用是有账号这个概念的，那么我们可以加入基于账号的验证；如果整个投票活动是基于某个活动流程，那么我们也可以加入流程验证。</p>
<p><strong>【从应用层到数据层】</strong><br />
在应用层接收到客户端的数据后，如果此时我们需要查询后台的数据进行相关计算，那么我们需要调用数据层获取数据，当把参数传给数据层后，数据层应该不相信应用层的数据，它需要按照自己的逻辑进行类型等的验证，然后再将查询的条件传给数据库。<br />
这样也许可以减少一些SQL注入漏洞。</p>
<p><strong>【从服务器应用层到客户端展示】</strong><br />
当应用层从数据层获取数据处理完后，需要在前台展示，此时会将计算结果返回给客户端。<br />
在显示计算结果之前我们需要将计算结果进行过滤。因为我们不相信服务器（或者说数据层）返回给我们的信息。对，不相信他们。<br />
这样也许可以减少一些存储式跨站脚本漏洞。</p>
<p><strong>【服务器本身的问题】</strong><br />
就PHP本身而言，一些必要的参数，安全模式的开启。比如php.ini中的open_basedir参数。<br />
或者在开发机器经常看到可以浏览整个目录的情况。<br />
或者PHP中的打开register_globals（新的版本默认为关闭）</p>
<p>所有的说到底就一个原则：<strong>不要相信任何人!</strong><br />
此时想起了面向对象中的迪米特法则：不要和陌生人说话。<br />
也许没有什么关联，只是在某些点上，大道相通。</p>
]]></content:encoded>
			<wfw:commentRss>https://www.phppan.com/2011/01/safe/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
