供应链攻击(Supply Chain Attack)
供应链攻击是一种针对供应链中的组织或产品的网络攻击形式。它利用供应链中的弱点或恶意行为,以获取未经授权的访问权限、窃取敏感信息、传播恶意软件或破坏目标组织的安全。
软件源安全
软件源安全是指在开发过程中或工作过程中使用的软件应该是安全的,需保证不会对开发或工作的环境造成破坏,不会对项目的开发造成风险。
解决方案:
- 成立软件管理委员会统一负责软件(包括开发软件)的评估、评级与分发。
- 软件管理委员会提供统一安装渠道(白名单机制),对待安装软件分级,分为“安全,警告,禁止”三个级别,对安全的软件提供统一获取渠道和标准化安装步骤(安全的商业软件提供授权获取通道),警告的软件由安装者自行保证(通常为暂未进行评估的软件或者竞品软件),对禁止的软件禁止安装并说明原因且提供推荐替代方案。如果同一个软件的不同版本安全级别可能不同,则当成两个软件对待。
- 如果使用者对未列在软件列表中的软件有需求可提供工单,由专人(软件管理委员会)对待安装软件进行评估和评级。
- 对已安装软件进行定期扫描,对不符合要求的软件进行告警提示,责令限期卸载。
服务器安全
服务器安全是指运行项目或代码的环境应保证是安全的。
解决方案:
使用经过验证的服务器与服务器配套组件:
- Web服务器类:Nginx、Apache、Tomcat、Resin、Nodejs
- 数据库类:MySQL(MariaDB)、Memcached、Mongodb、Redis
- 代理类:LVS/LB、Apache、Nginx、Varnish、Squid、HAProxy、Lighttpd
- 云计算&大数据:Hadoop、Spark、Storm、Docker
- 其它:各种编程语言及配套CGI、OpenSSL、OpenSSH、Rsync
框架/库安全
框架/库安全是指项目或代码依赖的框架库应保证是安全的。
解决方案:
- 自建内部软件源,对框架/库强制要求从内部源下载与更新,在必要时(例如某组件报安全问题后)可从源上禁止对框架/库的下载。
- 项目使用的框架和库需要采用正确的合适的授权协议。(BSD、MIT、Apache License)
- 提供黑名单机制,项目构建时强制要求扫描是否引入了黑名单中的框架/库,如果有引入,不能发布。(禁止 Struts、phpMyAdmin)
- 禁止框架/库的自动更新,固定版本号,确定开发与生产环境编译依赖一致。
- 定时更新项目依赖的框架/库,尤其是安全性更新。
- 生产环境关闭框架/库提供的报错和调试功能。
中间人攻击(Man-in-the-Middle)
MitM(Man-in-the-Middle)中间人攻击是一种网络安全攻击方式,攻击者通过在通信链路中插入自己作为中间人的角色,来窃取、篡改或伪造通信数据。
中间人攻击包括以下几种手段:
- ARP欺骗(ARP Spoofing)
攻击者通过伪造 ARP 响应包,将自己的 MAC 地址与目标 IP 地址绑定,使得通信流量经过攻击者的设备。
- DNS欺骗(DNS Spoofing)
攻击者篡改DNS响应,将合法域名解析到攻击者控制的恶意IP地址,使得用户访问的是攻击者的服务器。
- SSL/TLS劫持
攻击者伪造合法的SSL/TLS证书,使得用户与攻击者建立安全连接,从而能够窃取用户的敏感信息。
- WiFi钓鱼
攻击者创建一个伪装成合法WiFi网络的恶意热点,用户连接后,攻击者可以窃取用户的通信数据。
- IP欺骗
攻击者伪造源IP地址,使得目标服务器将响应发送给攻击者,从而能够窃取通信数据。
为了防范中间人攻击,可以采取以下措施:
- 使用加密通信:使用SSL/TLS等加密协议来保护通信数据的机密性,防止被中间人窃取。
- 验证证书:在建立SSL/TLS连接时,验证服务器的证书是否合法和可信,防止受到SSL/TLS劫持攻击。
- 使用VPN:通过使用虚拟私人网络(VPN),可以在公共网络上建立加密的通信隧道,防止中间人攻击。
- 注意网络环境:避免连接不可信的公共WiFi网络,尽量使用受信任的网络环境。
- 定期更新软件和设备:及时安装软件和设备的安全更新,以修复已知的安全漏洞。
会话劫持(Session Hijacking)
会话劫持是指攻击者通过某种方式获取合法用户的会话信息,然后利用这些信息冒充用户进行恶意操作或者获取敏感信息的行为。
为了避免会话劫持,可以采取以下措施:
使用HTTPS:使用HTTPS协议加密通信,防止会话信息在传输过程中被窃取或篡改。
使用安全的会话管理机制:确保会话ID的安全性,避免会话ID被猜测或者盗取。可以使用随机、复杂的会话ID,并设置合理的过期时间。
防止跨站脚本攻击(XSS):通过对用户输入进行合理的过滤和转义,防止恶意脚本注入,从而避免攻击者窃取会话信息。
防止跨站请求伪造(CSRF):使用CSRF令牌验证用户请求的合法性,确保请求来自合法的源。
定期更新和强化密码策略:要求用户使用强密码,并定期更新密码,避免密码被猜测或者破解。
使用双因素认证:引入双因素认证机制,增加登录的安全性,即使会话信息被窃取,攻击者也无法轻易登录。
定期审查和监控会话活动:监控用户会话活动,及时发现异常行为,并采取相应的措施。
会话固定(Session fixation)
利用了应用程序在建立用户会话时的漏洞。攻击者通过在用户登录之前或之后获取会话标识符(Session ID),然后将该会话标识符注入到目标用户的会话中。这样,攻击者就能够控制目标用户的会话,获取其敏感信息或执行未经授权的操作。
攻击者通常会使用以下几种方式进行会话固定攻击:
预先分配会话标识符:攻击者在用户登录之前就生成一个会话标识符,并将其发送给用户。当用户登录时,应用程序会使用该会话标识符来建立用户会话。然而,攻击者已经知道了该会话标识符,并可以使用它来获取用户的会话。
会话标识符传递:攻击者通过某种方式将自己的会话标识符传递给目标用户,例如通过URL参数、隐藏表单字段或Cookie。当目标用户使用该会话标识符登录时,攻击者就能够获取用户的会话。
一旦攻击者成功固定了目标用户的会话,他们可以模拟目标用户的身份,执行各种操作,包括访问用户的个人信息、修改用户设置、进行未经授权的操作等。
为了防止会话固定攻击,应用程序可以采取以下措施:
生成随机的会话标识符:应用程序应该使用足够强大的随机算法生成会话标识符,以使攻击者无法猜测或预测会话标识符。
在用户登录时重新生成会话标识符:应用程序在用户登录时应该生成一个新的会话标识符,并将旧的会话标识符无效化,以防止攻击者使用预先分配的会话标识符。
使用HTTPS:使用HTTPS加密通信可以防止攻击者在网络传输过程中截获会话标识符。
限制会话的有效期:应用程序可以设置会话的有效期,使会话在一定时间后自动过期,从而减少攻击者的窗口期。
分布式拒绝服务(DDoS,Distributed Denial of Service)
分布式拒绝服务攻击指借助于客户/服务器技术,将多个计算机联合起来作为攻击平台,对一个或多个目标发起请求,从而使受攻击方网络瘫痪的一种攻击方式。
详见 DDos
代码注入(Code Injection)
代码注入是指攻击者通过将恶意代码注入到应用程序的输入参数中,从而使应用程序执行攻击者所期望操作的行为。代码注入攻击可以利用应用程序对用户输入的不正确处理,从而导致应用程序受到攻击。
SQL注入(SQL Injection)
如果程序根据用户输入的参数动态生成SQL语句并执行,黑客可通过传入恶意参数值注入自己定义的语句,使数据库执行任意自己需要的指令,实现数据窃取或入侵破坏。
命令注入(Command Injection)
如果程序根据用户输入的参数动态生成系统命令并执行,黑客可通过传入恶意参数值注入自己定义的命令,从而控制服务器。
XSS跨站脚本(Cross Site Scripting)
XSS是发生在目标用户的浏览器层面上的攻击方式,当浏览器渲染页面的过程中发生了不在预期内执行的JS代码时,就发生了XSS攻击。
详见 XSS
为了防止代码注入攻击,可以采取以下措施:
输入验证和过滤:对于用户输入的数据,进行验证和过滤,确保只接受符合预期格式和类型的数据。例如,对于数字输入,可以使用输入验证函数确保只接受数字字符。
使用参数化查询或预编译语句:对于数据库查询,使用参数化查询或预编译语句,而不是将用户输入直接拼接到查询语句中。这样可以防止SQL注入攻击,因为参数化查询会将用户输入作为参数传递,而不是将其作为查询的一部分。
输出转义和过滤:在将数据输出到应用程序的界面或其他地方时,进行适当的转义和过滤。这可以防止跨站脚本攻击,因为转义和过滤可以确保恶意脚本代码不会被执行。
最小权限原则:确保应用程序在执行操作时具有最小的权限。这意味着应用程序只能访问和执行必要的操作,而不是拥有完整的系统权限。这可以减少攻击者利用代码注入攻击获得的潜在权限。
定期更新和修补漏洞:及时更新和修补应用程序的漏洞是非常重要的。漏洞可能会被攻击者利用来进行代码注入攻击。通过及时更新和修补漏洞,可以增强应用程序的安全性。
跨站请求伪造(CSRF,Cross Site Request Forgery)
CSRF跨站请求伪造,也被称为 One Click Attack 或者 Session Riding ,通常缩写为 CSRF 或者 XSRF ,是一种通过伪造用户请求破坏网站的攻击方式。
详见 CSRF
服务器请求伪造(SSRF,Server Side Request Forgery)
服务器请求伪造(Server-Side Request Forgery,SSRF)是一种攻击技术,攻击者通过欺骗服务器发起伪造的请求,使服务器在其信任的上下文中执行恶意操作。攻击者通常会利用服务器对其他系统或资源的信任来执行攻击,例如访问内部网络、绕过防火墙或执行未经授权的操作。
为了防范服务器请求伪造(SSRF)攻击,可以采取以下措施:
输入验证和过滤:对于用户提供的输入,应该进行严格的验证和过滤,确保输入的URL或参数符合预期的格式和范围。可以使用白名单来限制允许的URL或IP地址。
限制服务器访问权限:服务器应该以最小特权原则运行,并限制其对其他系统或资源的访问权限。确保服务器只能访问必要的资源,并禁止访问敏感的内部网络。
使用安全的网络代理:在服务器和外部资源之间使用安全的网络代理,例如反向代理或应用程序防火墙(WAF),以过滤和检测恶意请求。
防火墙配置:配置防火墙以限制服务器对外部网络的访问,并阻止不必要的出站连接。
安全的URL解析:在服务器端解析和处理URL时,应该使用安全的解析库或函数,以防止恶意URL的利用。
定期更新和维护:及时更新服务器和相关软件的补丁和安全更新,以修复已知的漏洞和弱点。
安全意识培训:对开发人员和系统管理员进行安全意识培训,使其了解服务器请求伪造(SSRF)攻击的风险,并学习如何防范和应对此类攻击。
点击劫持(Click Hijacking)
攻击者在恶意站点实现了一个和信任站点极其相似的恶意页面,然后在恶意页面的上层覆盖了一个信任站点的合法页面(通常采用 iframe 的方式),并将合法页面设置成透明态,诱导用户点击页面,这时实际触发的是合法页面上的事件。用户的操作被劫持到攻击者事先设计好的恶意按钮或链接上,从而导致用户敏感信息泄露、实施转账、添加权限或者删除记录等敏感操作。
要防范点击劫持(Clickjacking)攻击,可以采取以下措施:
使用X-Frame-Options头部:通过在HTTP响应头中设置X-Frame-Options头部,可以指示浏览器不允许将网页嵌入到iframe中,从而防止点击劫持攻击。可以设置X-Frame-Options头部为”deny”,表示不允许嵌入到任何iframe中,或者设置为”sameorigin”,表示只允许嵌入到同源的iframe中。
使用Content Security Policy(CSP):CSP是一种安全策略,可以通过限制网页中允许加载的资源和执行的操作来防止点击劫持等攻击。可以在HTTP响应头中设置Content-Security-Policy头部,指定允许的资源来源和操作限制。
使用Frame Busting代码:在网页中嵌入Frame Busting代码,可以检测当前页面是否被嵌入到iframe中,并在检测到时跳转或显示警告信息,以防止点击劫持攻击。常见的Frame Busting代码包括JavaScript代码,例如使用window.top.location.href跳转到顶级窗口。
设置透明样式:通过将网页的样式设置为透明或与背景颜色相同,可以防止攻击者将网页隐藏在其他可见元素之下,从而防止点击劫持攻击。
用户教育和意识提高:提高用户对点击劫持攻击的认识和意识,教育用户不要点击可疑或未知来源的链接,以及注意网页的外观和行为是否正常。
点击欺骗(Click Bait)
攻击者通过伪装成合法网站或应用程序,诱使用户点击恶意链接或下载恶意文件。
防范点击欺骗的措施与防范点击劫持的方案相同。
文件上传下载读取漏洞
任意文件上传(Unrestricted File Upload)
任意文件上传漏洞是由于 Web 应用程序在实现文件上传功能时对上传的文件缺少必要的检查,使得攻击者可上传任意文件。利用该漏洞,攻击者可以直接上传 webshell (WebShell就是以asp、php、jsp或者cgi等网页文件形式存在的一种命令执行环境,也可以将其称之为一种网页后门)、病毒、恶意脚本等各种危险文件,可能导致服务器权限被直接获取,从而危及整个系统的安全运行。
解决方案:
- 对用户上传的文件后缀采用白名单进行限制,且重命名文件名
- 限定文件上传目录,且该目录不允许解析动态脚本文件
- 更新 Web 服务器版本,防止解析漏洞
- 上传接口严格控制权限和认证,文件上传前必须验证用户身份
- 服务器端对 HTTP 包头的 MIME Type 和上传文件的大小也需要进行检查,文件上传校验不但要验证文件包头信息是否匹配,而且要验证文件后缀名,最后还要限制合适的文件大小
- 使用对象存储存放用户上传的文件,与Web容器隔离
任意文件读取(Unrestricted File Read)
因 Web 程序提供的文件查看下载、附件下载等功能存在安全缺陷,导致通过修改文件路径就能够查看和下载任意文件,这些文件包括:源代码文件、系统文件( /etc/passwd
、C:/boot.ini
等)、配置文件( config.php
、 /WEB-INF/web.xml
、 web.config
等),造成网站敏感信息泄露,严重危害网站安全。
解决方案:
- 服务端过滤特殊字符,如:“.”、“/”、“\”
- 判断用户输入的参数的格式是否合法
- 指定文件类型白名单(如:jpg、gif、png、rar、zip、pdf、doc、xls、ppt等),禁止用户读取、下载白名单以外的文件
- 指定下载路径,禁止用户读取、下载指定目录以外的文件
任意文件包含(Unrestricted File Inclusion)
Web 程序在引入文件时,由于传入的文件名没有经过合理的校验,或者检验被绕过,从而操作了预想之外的文件,导致意外的敏感信息泄露,甚至恶意的代码注入,使攻击者获取到网站服务器权限。
解决方案:
- 关闭危险的文件打开函数
- 过滤特殊字符,如:“.”、“/”、“\”
- 检测文件内容
任意URL跳转(Open Redirect)
某些业务场景(例如登录跳转、导航前进后退)会接受不信任的用户输入,并返回一个 302 响应或者 URL 重定向。因此攻击者通过操控输入的 URL ,可以欺骗用户跳转到不安全的页面,造成钓鱼攻击。
要防范任意URL跳转(Open Redirect)攻击,可以采取以下措施:
输入验证和过滤:对于用户提供的输入,特别是涉及到URL跳转的参数,应该进行严格的验证和过滤。确保输入的URL符合预期的格式和范围,只允许跳转到可信的域名或URL。
使用白名单:维护一个白名单,列出允许跳转的URL或域名。在进行URL跳转之前,检查目标URL是否在白名单中,如果不在则拒绝跳转。
验证跳转URL的合法性:在进行URL跳转之前,对目标URL进行验证,确保它是一个合法的URL。可以使用URL解析库或正则表达式来验证URL的格式和结构。
使用安全的跳转方法:使用安全的跳转方法,例如使用服务器端重定向(HTTP 301或302状态码)来进行跳转,而不是直接在页面中使用JavaScript进行跳转。服务器端重定向可以提供更好的控制和安全性。
显示警告信息:在进行URL跳转之前,向用户显示警告信息,告知他们即将离开当前网站,并提醒他们注意目标网站的可信度。这可以增加用户的警觉性,减少受到欺骗的风险。
用户教育和意识提高:提高用户对任意URL跳转攻击的认识和意识,教育用户不要点击可疑或未知来源的链接,以及注意URL的域名和路径是否与预期一致。
7.缓冲区溢出(Buffer Overflow)
缓冲区溢出是针对程序设计缺陷,向程序输入缓冲区写入使之溢出的内容(通常是超过缓冲区能保存的最大数据量的数据),从而破坏程序运行、并获取程序乃至系统的控制权的一种攻击行为。
要防范缓冲区溢出(Buffer Overflow)攻击,可以采取以下措施:
输入验证和过滤:对于用户输入的数据,进行严格的验证和过滤,确保输入的数据符合预期的格式和范围。例如,限制输入的长度,检查输入是否包含非法字符或特殊字符。
使用安全的编程语言和库:选择使用安全的编程语言和库,这些语言和库提供了内置的缓冲区溢出保护机制,例如自动内存管理和边界检查。避免使用容易受到缓冲区溢出攻击的编程语言和库。
使用安全的函数和API:使用安全的函数和API来处理字符串和缓冲区操作,这些函数和API提供了边界检查和长度限制,可以防止缓冲区溢出。例如,使用安全的字符串拷贝函数(如strncpy)替代不安全的函数(如strcpy)。
使用堆栈保护技术:使用堆栈保护技术,例如栈溢出保护(Stack Overflow Protection)和地址空间布局随机化(Address Space Layout Randomization,ASLR)。这些技术可以在运行时检测和防止缓冲区溢出攻击。
定期更新和修补软件:及时更新和修补软件,包括操作系统、编译器和库文件。这些更新和修补通常包含了对已知缓冲区溢出漏洞的修复。
安全编码实践:遵循安全编码实践,例如避免使用不安全的函数、避免硬编码敏感信息、进行错误处理和异常处理等。这些实践可以减少缓冲区溢出攻击的风险。
安全测试和代码审查:进行安全测试和代码审查,以发现潜在的缓冲区溢出漏洞。使用静态代码分析工具和漏洞扫描工具来辅助发现和修复安全问题。
钓鱼攻击(Phishing Attack)
攻击者伪装成受信任的实体欺骗受害者,通过发送邮件或者文件的方式,诱骗受害者暴露密码或者执行恶意代码。
要防范钓鱼攻击(Phishing Attack),可以采取以下措施:
提高用户教育和意识:教育用户如何识别和避免钓鱼攻击。提醒用户不要点击可疑的链接或附件,不要泄露个人敏感信息,以及注意验证网站的真实性。
验证网站的真实性:在访问网站时,确保网站使用了安全的HTTPS协议,并且具有有效的SSL证书。用户可以通过检查网站的URL是否以”https://“开头,并且浏览器是否显示了安全锁定图标来验证网站的真实性。
警惕钓鱼邮件和信息:警惕来自不明或可疑发送者的电子邮件、短信或社交媒体信息。避免点击其中的链接或下载附件,特别是要求提供个人信息或登录凭据的链接。
使用多因素身份验证:对于重要的账户和系统,启用多因素身份验证(MFA)。这样即使攻击者获得了用户名和密码,仍需要额外的身份验证因素才能登录。
定期更新和维护系统:及时更新和维护操作系统、应用程序和安全软件,以修复已知的漏洞和安全问题。这可以减少攻击者利用已知漏洞进行钓鱼攻击的机会。
使用反钓鱼工具和技术:使用反钓鱼工具和技术来检测和阻止钓鱼网站和恶意链接。这些工具可以帮助过滤和阻止钓鱼邮件、恶意网站和欺诈性链接。
加强网络安全意识:组织和企业应加强网络安全意识,培训员工如何识别和应对钓鱼攻击。建立报告机制,使员工能够及时报告可疑的钓鱼邮件、信息或网站。同时,组织和企业可以进行模拟钓鱼攻击,以测试员工的警惕性和应对能力,并提供相应的培训和指导。
使用安全浏览器和防病毒软件:选择使用安全性较高的浏览器,并及时更新浏览器和防病毒软件。这些工具可以帮助检测和阻止钓鱼网站、恶意链接和恶意软件。
实施安全策略和访问控制:制定和实施严格的安全策略和访问控制措施,限制对敏感信息和系统的访问。确保只有授权的人员能够访问和处理敏感数据。
监测和响应:建立监测和响应机制,及时检测和应对钓鱼攻击。使用安全事件和信息管理系统(SIEM)来监视网络活动,并采取适当的措施来应对和阻止钓鱼攻击。
逻辑漏洞(Logical Vulnerabilities)
攻击者利用应用程序中的逻辑错误或不完善的业务流程,绕过安全控制,执行未经授权的操作。
信息泄露(Information Disclosure)
攻击者通过获取应用程序或系统中的敏感信息,如配置文件、日志文件、错误消息等,来获取有关目标系统的有用信息。
重放攻击(Replay Attack)
攻击者截获合法用户的请求,并将其重新发送给目标服务器,以执行未经授权的操作。
要防范重放攻击(Replay Attack),可以采取以下措施:
使用加密和身份验证:使用加密技术来保护通信数据的机密性和完整性。同时,使用身份验证机制来验证通信双方的身份,确保只有合法的用户可以访问系统。
使用随机化和时间戳:在通信过程中引入随机化和时间戳,使每个请求都具有唯一性。这样可以防止攻击者重放之前的请求。
使用单次令牌(One-Time Token):为每个请求生成一个单次令牌,确保每个令牌只能使用一次。这样即使攻击者截获了请求,也无法再次使用该令牌进行攻击。
使用挑战-响应认证:在通信过程中使用挑战-响应认证机制,其中服务器向客户端发送一个随机的挑战,客户端必须正确响应该挑战才能继续通信。这样可以防止攻击者重放之前的响应。
使用防重放令牌:在通信中使用防重放令牌,这些令牌具有短暂的有效期,并且每次请求都需要携带有效的令牌。服务器会验证令牌的有效性,如果令牌已过期或已使用过,则拒绝请求。
监测和记录请求:实施请求监测和记录机制,记录每个请求的相关信息,包括时间戳、来源IP地址等。这样可以检测到重放攻击的迹象,并采取相应的防御措施。
定期更新密钥和令牌:定期更新加密密钥和令牌,以增加攻击者破解的难度。使用强大的加密算法和安全的密钥管理机制,确保密钥的保密性和完整性。
使用防重放协议:在通信协议中使用防重放机制,例如使用序列号或时间戳来标识每个请求,确保每个请求都是唯一的。这样可以防止攻击者重放之前的请求。
强化网络安全防护:采用综合的网络安全防护措施,包括防火墙、入侵检测系统(IDS)、入侵防御系统(IPS)等,以及定期进行安全漏洞扫描和渗透测试,及时发现和修复系统中的安全漏洞。
监测和响应:建立实时监测和响应机制,及时检测和应对重放攻击。使用安全事件和信息管理系统(SIEM)来监视网络活动,并采取适当的措施来阻止和应对重放攻击。
逆向工程(Reverse Engineering)
攻击者通过分析应用程序的二进制代码或反编译应用程序,来获取有关应用程序的敏感信息或执行未经授权的操作。
要防范逆向工程(Reverse Engineering),可以采取以下措施:
代码混淆(Code Obfuscation):通过对源代码进行混淆,使其难以理解和分析。这可以包括重命名变量和函数名,删除或添加无用代码,以及使用特定的算法和技术来隐藏代码逻辑。
加密关键代码和敏感数据:对于包含关键算法或敏感数据的部分,可以使用加密技术进行保护。这样即使逆向工程成功,攻击者也无法轻易获取到明文的关键信息。
使用硬件保护:将关键代码和数据存储在安全的硬件模块中,如安全芯片或加密USB设备。这样可以增加逆向工程的难度,因为攻击者需要物理访问硬件才能进行分析。
使用反调试和反动态分析技术:在应用程序中集成反调试和反动态分析技术,以阻止攻击者使用调试器或动态分析工具来分析应用程序的执行过程。
强化应用程序的安全性:采用安全编码实践,如输入验证、输出编码、访问控制等,以防止常见的安全漏洞,如缓冲区溢出、代码注入等。同时,定期进行安全审计和漏洞扫描,及时修复发现的安全漏洞。
使用软件保护工具:使用专业的软件保护工具,如代码加壳、反调试工具、代码签名等,以增加逆向工程的难度。
法律保护:了解并遵守相关的知识产权和法律法规,如软件许可协议、版权保护等。在必要的情况下,可以采取法律手段来保护自己的知识产权。
安全加固手段
HTTPS
详见 HTTPS
在用户请求资源时,如果请求的是 http 资源,则 302 重定向到 https 资源,并添加 Strict-Transport-Security
要求强制使用 HTTPS 协议。
输入验证(Validation)
前端与后端均需进行输入验证,对用户的输入表单参数、URL参数、HTTP头进行校验。
需要校验参数类型,长度,范围,字符集合是否符合要求,同时需要根据业务类型校验参数。
常见的业务类型包括:日期、域名、ip、邮箱地址、用户名、手机号(带国际区号)、用户ID等。
对SQL注入、XSS、命令注入中常见的危险字符 <>'"%|;&/\
进行过滤或实体编码。
拼接URL时需要进行实体编码。
保证前后端校验方法一致。
数据脱敏(Data Mask)
API 接口或 HTTP 服务如果没有对敏感信息进行脱敏输出,可能会被嗅探收集、批量爬取,泄漏业务核心数据。
需要脱敏的数据包括姓名、手机号、身份证号、银行卡号、邮箱、营业执照号、社交媒体账号、工资流水、通信记录等。
接口频率限制(Frequency Limiting)
接口需要限制请求频率,防止对接口数据进行爬取或者对登录接口进行暴力破解。
核心数据接口要求权限认证。
加密(Encryption)
- 密码在设定时要求二次输入验证,防止用户手动输入错误,二次输入禁止复制粘贴
- 在传输过程中可以进行 base-64 编码,防止在传输之前(例如devtools中)被查看
- 在存储时需要加盐加密,知名的不安全算法包括 MD5、SHA-1
多因子认证(Multi Factor Authentication)
多因子认证是用两种及两种以上的条件对用户进行认证的方法。通常将口令和实物(如U盾、密码器、手机短信、指纹等)结合起来,以有效提升安全性。
验证码(Verification Code)
验证码又被称为 全自动区分计算机和人类的图灵测试(CAPTCHA,Completely Automated Public Turing test to tell Computers and Humans Apart)是一种区分用户是计算机还是人的公共全自动程序,主要为了防止机器的暴力破解和批量提交。常见的人机识别方法包括文本识别验证、图片点选验证、滑块拼图验证、用户行为验证等。
代码混淆(Code Obfuscation)
通过对源代码进行混淆,使其难以理解和分析。这包括重命名变量和函数名、添加无用代码和逻辑、修改代码结构等。代码混淆可以增加逆向工程的难度,使攻击者难以理解和还原源代码。
Cookie安全
详见 Cookie
解决方案:
- 添加 HttpOnly 标志只允许服务器进行读取,防止xss攻击
- 添加 Secure 标志,采用 HTTPS 请求,防止被中间人获取
- 为了防止 Cookie 被篡改,服务器通常可以将 会话标志符 存储在 Cookie 中,而不是直接存储会话信息。这样,即使攻击者获取到了 Cookie 内容,如果不知道会话标志符编码解码规则,就无法进行修改。
- 如果站点使用 Cookie 对用户进行身份验证,则每当用户进行身份验证时,它都应重新生成并重新发送会话 Cookie,即使会话 Cookie 已经存在。
- 服务器不应该在同一主机的不同端口上运行互不信任的服务。
- 服务器不应该在同一主机的不同路径上运行互不信任的服务。
HTTP header 设置
解决方案:
- 通过设置
X-Frame-Option
告知浏览器该页面是否可以被嵌入,减少被 点击劫持 攻击的可能 - 通过设置
Content-Security-Policy
告知浏览器该页面的内容安全策略,减少被 XSS 攻击的可能 - 通过设置
Referrer-Policy
监管访问来源信息,减少来源地址探测 - 通过设置
Cross-Origin-Opener-Policy
Cross-Origin-Resource-Policy
Cross-Origin-Embedder-Policy
来减少跨源跳转/嵌入时的可能攻击 - 添加 csrf token ,减少被 CSRF 攻击的可能
服务器安全
- 及时更新和修补漏洞
- 防火墙和入侵检测系统(IDS/IPS)
- 安全审计和日志记录
- 定期安全评估和渗透测试
运维安全
- 灾备
- 运维日志记录
- 运维行为审计
- 运维账号、权限控制
- 定期安全培训
法律保护
中国与数据安全和网络安全有关的法律法规包括:
《中华人民共和国网络安全法》:该法于2017年6月1日正式实施,旨在保护网络安全,维护国家安全和社会公共利益。它规定了网络运营者的责任和义务,要求网络运营者采取措施保护用户信息和网络数据的安全。
《中华人民共和国个人信息保护法》:该法于2021年11月1日正式实施,旨在保护个人信息的合法收集、使用和处理。它规定了个人信息的定义、个人信息处理者的义务和责任,以及个人信息泄露和滥用的处罚措施。
《中华人民共和国电子商务法》:该法于2019年1月1日正式实施,旨在规范电子商务活动,保护消费者权益和网络交易安全。它规定了电子商务经营者的责任和义务,要求保护用户的个人信息和交易数据安全。
《中华人民共和国反垄断法》:该法于2008年8月1日正式实施,旨在维护市场竞争秩序,保护消费者权益。它规定了反垄断行为的禁止和处罚,包括滥用市场支配地位、垄断协议和滥用知识产权等行为。
《中华人民共和国商业秘密法》:该法于2018年7月1日正式实施,旨在保护商业秘密的合法权益。它规定了商业秘密的定义、保护范围和保护措施,以及商业秘密的侵权行为和法律责任。
《中华人民共和国计算机信息系统安全保护条例》:该条例于1994年12月1日正式实施,旨在保护计算机信息系统的安全。它规定了计算机信息系统的安全保护要求、安全管理措施和安全事件的处理程序。
《中华人民共和国反恶意程序条例》:该条例于2019年3月1日正式实施,旨在防止和打击恶意程序的传播和使用。它规定了恶意程序的定义、禁止行为和处罚措施,以及恶意程序的防范和处理措施。
《中华人民共和国数据安全法》:该法自2021年9月1日起施行,该法旨在加强对数据的保护和管理,维护国家安全和社会公共利益。它强调了数据安全的重要性,要求各方主体加强数据安全管理,保护个人信息和重要数据的安全。