0

0

如何缓解 Go 中的 SSRF 漏洞

碧海醫心

碧海醫心

发布时间:2024-12-11 11:45:10

|

889人浏览过

|

来源于dev.to

转载

如何缓解 go 中的 ssrf 漏洞

在开发 go 应用程序以防止服务器端请求伪造 (ssrf) 等漏洞时,保护 http 请求至关重要。当攻击者操纵服务器发出无意的请求,可能访问内部服务或敏感数据时,就会发生 ssrf。

我们将探索如何通过使用 url 解析和验证技术来保护 http 请求,并提供示例代码来强化 http.get http get 请求处理程序。

向用户自己的域发送 http 请求以获取图像的 http 路由处理程序代码如下(为简洁起见),位于名为 downloadandresize 的函数中:

func downloadandresize(tenantid, fileid, filesize string) error {
    // ...

    downloadresp, err := http.get(info.download)
    if (err != nil) {
        panic(err)
    }

    // ...
}

缓解 go 代码中的 ssrf 漏洞

为了缓解 go 应用程序中的 ssrf 漏洞,开发人员应该专注于验证和清理输入,并了解如何以不操纵结果域的方式安全地构造 url。

ssrf 攻击通常利用输入验证不足的情况,允许攻击者操纵 url 并将请求重定向到非预期目的地。通过实施强大的输入验证和清理,开发人员可以显着降低 ssrf 攻击的风险。

实现tenantid和fileid的输入验证

在我们易受攻击的 go 应用程序中,tenantid 和 fileid 是从查询字符串中提取的,无需任何验证。缺乏验证为 ssrf 攻击打开了大门。

让我们考虑以下实现输入验证的 go 代码,以确保这些参数可以安全使用:

func isvalidtenantid(tenantid string) bool {
    // implement a regex pattern to validate tenantid format
    // example: only allow alphanumeric characters
    validtenantidpattern := `^[a-za-z0-9]+$`
    matched, _ := regexp.matchstring(validtenantidpattern, tenantid)
    return matched
}

func isvalidfileid(fileid string) bool {
    // implement a regex pattern to validate fileid format
    // example: only allow alphanumeric characters and hyphens
    validfileidpattern := `^[a-za-z0-9-]+$`
    matched, _ := regexp.matchstring(validfileidpattern, fileid)
    return matched
}

限制对受信任主机的出站请求的重要性

缓解 ssrf 漏洞的另一个有效策略是限制对受信任主机的出站请求。这可以通过维护允许的主机白名单并验证每个请求的目标主机是否在此列表中来实现。

以下是如何在 downloadandresize 函数中实现主机限制的示例:

func isTrustedHost(host string) bool {
    // Define a list of trusted hosts
    trustedHosts := []string{"localtest.me", "example.com"}
    for _, trustedHost := range trustedHosts {
        if host == trustedHost {
            return true
        }
    }
    return false
}

func downloadAndResize(tenantID, fileID, fileSize string) error {
    urlStr := fmt.Sprintf("http://%s.%s/storage/%s.json", tenantID, baseHost, fileID)
    parsedURL, err := url.Parse(urlStr)
    if err != nil {
        panic(err)
    }

    if !isTrustedHost(parsedURL.Hostname()) {
        return fmt.Errorf("untrusted host: %s", parsedURL.Hostname())
    }

    // Proceed with the rest of the function
    // ...
}

通过实施允许的主机限制作为安全控制,我们确保 go 应用程序仅向预定义且受信任的主机的封闭列表发送 http 请求,从而进一步减少 ssrf 攻击的影响。

在开发中采用安全第一思维的重要性

采用安全第一的心态对于开发人员构建健壮且安全的应用程序至关重要,go 也不例外。这涉及将安全考虑因素集成到软件开发生命周期的每个阶段(从设计到部署)。

Pic Copilot
Pic Copilot

AI时代的顶级电商设计师,轻松打造爆款产品图片

下载

通过优先考虑安全性,开发人员可以:

  • 降低安全漏洞和数据泄露的风险。
  • 保护用户数据并维护信任。
  • 遵守行业法规和标准。
  • 最大限度地减少安全事件的成本和影响。

通过遵循这些最佳实践并利用 go 安全备忘单等资源,开发人员可以增强 go 应用程序的安全性并防范 ssrf 等威胁。

利用 snyk 代码确保安全

我们了解了如何防范 ssrf 漏洞,以及为什么开发人员应该验证和清理用户输入、限制对受信任主机的出站请求,以及使用白名单来控制可以访问哪些域。此外,利用 snyk code 等安全工具可以帮助在开发过程的早期识别和修复此类漏洞。

为了进一步增强应用程序的安全性,请考虑使用 snyk code 进行静态分析。 snyk code 可以在部署之前识别 go 代码中的 ssrf 漏洞和其他安全问题。通过将 snyk 集成到您的 ide 或存储库中,您可以及早发现漏洞并确保您的应用程序保持安全。

有关更多 go 安全最佳实践,请查看 go 安全备忘单并了解如何使用 docker 安全地容器化您的应用程序。

通过实施这些技术并利用 snyk 等工具,您可以保护您的 go 应用程序免受 ssrf 攻击和其他安全威胁。

snyk 可以与其他编程语言一起使用吗?

snyk 是一款多功能工具,支持多种编程语言,使其成为从事不同技术堆栈的开发人员的重要资产。无论是使用 javascript、python、java、ruby、php 还是其他语言进行开发,snyk 都能提供针对每个生态系统量身定制的全面安全解决方案。

这包括:

  • javascript 和 typescript:使用 snyk,您可以扫描 node.js 应用程序以查找代码和依赖项中的漏洞。
  • python:snyk 帮助识别 python 包中的漏洞并提供可操作的修复建议。
  • java:snyk 与 maven 和 gradle 的集成允许 java 开发人员通过识别和修复依赖项中的漏洞来保护他们的应用程序。
  • ruby:ruby 开发人员可以利用 snyk 扫描他们的 gemfiles 和 gemfile.lock 是否存在已知漏洞。

php:snyk 支持 composer,使 php 开发人员能够通过识别依赖项中的漏洞来保护他们的项目。

相关专题

更多
python开发工具
python开发工具

php中文网为大家提供各种python开发工具,好的开发工具,可帮助开发者攻克编程学习中的基础障碍,理解每一行源代码在程序执行时在计算机中的过程。php中文网还为大家带来python相关课程以及相关文章等内容,供大家免费下载使用。

753

2023.06.15

python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

636

2023.07.20

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

758

2023.07.25

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

618

2023.07.31

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

1262

2023.08.03

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

547

2023.08.04

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

577

2023.08.04

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

707

2023.08.11

Java 桌面应用开发(JavaFX 实战)
Java 桌面应用开发(JavaFX 实战)

本专题系统讲解 Java 在桌面应用开发领域的实战应用,重点围绕 JavaFX 框架,涵盖界面布局、控件使用、事件处理、FXML、样式美化(CSS)、多线程与UI响应优化,以及桌面应用的打包与发布。通过完整示例项目,帮助学习者掌握 使用 Java 构建现代化、跨平台桌面应用程序的核心能力。

36

2026.01.14

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 0.7万人学习

Django 教程
Django 教程

共28课时 | 3.1万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号