网站安全漏洞
网站安全漏洞是指由于开发不当、配置错误或第三方组件问题导致的系统或应用程序可以被攻击者利用,从而获取未授权的信息或权限。以下为常见的安全漏洞及其防护方法。
服务端漏洞
服务端漏洞是由于服务器端程序逻辑、配置、或第三方工具缺陷导致的安全问题。
第三方组件漏洞
在 Golang 开发中以及其他编程语言中,引用第三方组件是常见操作。但这些组件可能含有潜在漏洞,导致安全问题。
防护措施
- 安全审查:
- 定期对使用的第三方库进行漏洞扫描。
- 检查组件更新日志,关注安全性修复。
- 隔离运行:
- 使用容器或沙箱隔离运行第三方组件。
- 权限最小化:
- 限制第三方组件的权限。
- 依赖版本管理:
- 固定依赖版本,避免无意中升级到可能存在漏洞的版本。
SQL注入
场景及原因:
-
错误使用语言框架:
- 开发者直接拼接 SQL 语句,导致输入未被正确转义或验证。
-
框架特性问题:
- MyBatis:误用
${}替代#{}会导致拼接 SQL 字符串而非参数化查询。 - GORM:某些方法如
db.Order(param).Find(&p)会直接使用用户输入,容易引入 SQL 注入风险。
用户输入示例:
-
正常输入:
param: code SQL: SELECT * FROM users ORDER BY code -
恶意输入:
param: code; DROP TABLE users; SQL: SELECT * FROM users ORDER BY code; DROP TABLE users;
- MyBatis:误用
防护措施:
- 避免拼接 SQL:
- 使用预编译语句(Prepared Statements)。
- 利用 ORM 框架提供的安全方法。
- 框架特性安全使用:
- 在 MyBatis 中,优先使用
#{},不要直接拼接字符串。 - 在 GORM 中,避免将用户输入直接用于
Order或其他 SQL 片段。
- 在 MyBatis 中,优先使用
- 输入验证与语义检查:
- 对用户输入进行严格的类型检查和语义验证。
- 过滤或转义特殊字符(如
',",;,--)。
命令执行漏洞
场景:
开发中需要调用系统命令(如 shell 或 bash)以实现某些功能。如果未对输入进行严格验证,攻击者可能通过构造恶意输入实现命令注入。
示例代码:
cmd := fmt.Sprintf("ls %s", input)
output, err := exec.Command("sh", "-c", cmd).Output()
恶意输入:
input = "; rm -rf /"
防护措施:
- 设置白名单:
- 限制可执行命令的范围,确保只允许指定的命令。
- 输入类型检验:
- 检查输入是否符合预期(如长度、格式)。
- 特殊字符过滤:
- 过滤或转义特殊字符(如
;,&,|,>等)。
- 过滤或转义特殊字符(如
- 替代方案:
- 使用专门的 API 替代直接调用系统命令。
越权漏洞
场景:
-
未授权:
- 某些功能或资源未正确设置访问权限,导致任意用户可访问。
-
水平越权:
-
用户可以访问或修改其他同级用户的资源。
-
示例:修改 URL 中的
id参数。/user/profile?id=1 -> /user/profile?id=2
-
-
垂直越权:
- 普通用户通过构造请求访问管理员权限的资源。
防护措施:
- 权限校验:
- 在每个请求中严格校验用户的权限。
- 最小化授权原则:
- 用户仅能访问与其角色对应的资源。
- 标识验证:
- 对 URL 参数中的用户标识(如
id)进行验证,确保用户只能访问自己的数据。
- 对 URL 参数中的用户标识(如
SSRF(服务器端请求伪造)
场景:
攻击者通过伪造请求,利用服务器权限访问内部网络资源。
防护措施:
- 限制目标地址:
- 使用 IP 白名单,限制服务器可访问的地址范围。
- 过滤用户输入:
- 对用户提供的 URL 进行严格的格式校验,防止内网地址访问(如
127.0.0.1、localhost)。
- 对用户提供的 URL 进行严格的格式校验,防止内网地址访问(如
文件上传漏洞
场景:
用户上传了包含恶意代码的文件,服务器未验证文件内容,导致漏洞被利用。
防护措施:
- 文件类型验证:
- 检查文件扩展名及 MIME 类型。
- 使用库分析文件内容以判断其真实性。
- 存储目录隔离:
- 将上传文件存储在非执行目录中。
- 文件名随机化:
- 为上传文件生成唯一随机文件名,避免覆盖或恶意访问。
- 限制权限:
- 上传目录仅允许写入,不可执行。
- 病毒扫描:
- 使用病毒扫描工具检查上传文件。
客户端漏洞
客户端漏洞是指由于前端开发或客户端交互设计不当,导致攻击者可以通过恶意输入、代码注入、或利用浏览器特性等手段对用户或服务器发起攻击。
开放重定向
场景:
开放重定向指应用程序允许用户提供重定向 URL,且未对 URL 的合法性进行严格校验,可能被攻击者利用实现钓鱼攻击或窃取敏感信息。
攻击流程:
- 用户点击合法域名链接。
- 链接重定向到攻击者控制的恶意网站。
- 用户被引导输入敏感信息,如登录凭据、银行卡信息等。
防护措施:
- 白名单机制
- 限制允许重定向的目标域名。
- 例如,仅允许内部域名或特定可信域名。
- 参数校验
- 验证
redirectUrl的合法性(如必须包含可信的域名或路径)。
- 验证
- URL 编码
- 对用户输入的 URL 进行编码,防止注入。
XSS(跨站脚本攻击)
场景及本质:
XSS 是一种通过向网页注入恶意 JavaScript 脚本来执行未授权操作的攻击手段。本质是对用户输入未进行过滤和转义,导致攻击者的脚本可以在受害者的浏览器中执行。
防护措施:
- 输入过滤:
- 对所有用户输入进行严格验证,过滤危险字符。
- 使用安全库处理用户输入。
- 输出转义:
- 对动态生成的 HTML、JavaScript、CSS 内容进行适当转义。
- 内容安全策略(CSP):
- 配置 CSP 限制页面加载的脚本来源
CSRF(跨站请求伪造)
场景及本质:
CSRF 攻击通过伪造受害者的身份,在未授权的情况下执行敏感操作,例如修改用户设置、提交表单、或发起交易。
防护措施:
- CSRF Token:
- 在每个表单或请求中加入随机生成的 Token,服务器验证其合法性。
- SameSite Cookie 属性:
- 配置 Cookie 的
SameSite属性,限制跨站点的请求携带 Cookie:Strict:完全限制跨站点请求。Lax(默认):允许部分跨站点请求(如 GET)。None:允许跨站点请求(需 HTTPS)。
- 配置 Cookie 的
- Referer 和 Origin 验证:
- 检查请求的
Referer或Origin是否来自可信来源。
- 检查请求的
- 实际微服务场景防护:
- Token 验证:在每个微服务请求中携带 Token 并验证。
- 网关校验:在网关层统一拦截并验证 Token,有效减少单点防护的复杂度。
点击劫持
场景及本质:
攻击者在一个透明的 iframe 中加载目标网站,并诱导用户在不知情的情况下点击,导致执行攻击者预期的操作。
示例攻击场景:
- 用户点击一个看似无害的按钮。
- 实际操作被转发到嵌套 iframe 中的攻击页面。
防护措施:
-
配置 CSP,限制页面嵌套来源。
-
使用 JS 检测页面是否被 iframe 嵌套,并阻止显示。