Golang中推荐的SAML库有哪些

Golang中推荐的SAML库有哪些 我正在开发一个包含故意SAML漏洞的应用程序,目前推荐使用什么框架?我需要一个易于安装且可灵活修改的工具,以便能够禁用签名验证或时间验证等功能。

3 回复

GitHub头像

mattbaird/gosaml

用Go语言编写的SAML客户端库。通过创建GitHub账户为mattbaird/gosaml开发做贡献。

更多关于Golang中推荐的SAML库有哪些的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


我最终尝试使用了这个项目

GitHub GitHub

头像

crewjam/saml

用于 Go 的 SAML 库。通过在 GitHub 上创建账户来为 crewjam/saml 开发做贡献。

我不知道它是否比那个更好或更差,但它有最近的更新,这很好。

在Golang中,有几个库可用于处理SAML,但根据你的需求(故意引入漏洞,如禁用签名验证或时间验证),建议使用以下库:

  1. github.com/crewjam/saml
    这是Go中最流行的SAML库之一,提供完整的SAML服务提供者(SP)和身份提供者(IdP)功能。它的代码结构清晰,易于修改以禁用安全功能。例如,你可以通过修改验证逻辑来绕过签名检查或时间验证。

  2. github.com/russellhaering/gosaml2
    另一个广泛使用的库,支持SAML 2.0协议。它允许通过自定义配置禁用某些验证步骤,例如通过设置SkipSignatureValidation字段为true来跳过签名验证。

示例代码:使用gosaml2禁用签名验证

以下是一个简单示例,展示如何配置gosaml2来禁用SAML响应的签名验证。注意:这仅用于测试目的,切勿在生产环境中使用。

package main

import (
    "github.com/russellhaering/gosaml2"
    "github.com/russellhaering/gosaml2/types"
)

func main() {
    // 配置SAML服务提供者
    sp := &saml2.SAMLServiceProvider{
        IdentityProviderSSOURL:      "https://idp.example.com/sso",
        IdentityProviderIssuer:      "https://idp.example.com",
        ServiceProviderIssuer:       "https://sp.example.com",
        AssertionConsumerServiceURL: "https://sp.example.com/acs",
        SignAuthnRequests:           false,
        SkipSignatureValidation:     true, // 禁用签名验证
    }

    // 示例:处理SAML响应(假设已获取响应字符串)
    samlResponse := "<SAMLResponse>...</SAMLResponse>"
    assert, err := sp.RetrieveAssertionInfo(samlResponse)
    if err != nil {
        // 处理错误
        panic(err)
    }

    // 使用断言信息(例如用户数据)
    _ = assert
}

示例代码:修改crewjam/saml以禁用时间验证

对于crewjam/saml库,你可以通过修改源代码来禁用时间验证。例如,在验证断言时,注释掉或修改时间检查逻辑。以下是简化示例:

  1. 克隆库到本地:git clone https://github.com/crewjam/saml
  2. 在文件saml.go中找到验证函数(如ValidateVerifyAssertion),修改时间验证部分:
// 示例修改:在验证逻辑中跳过时间检查
func (sp *ServiceProvider) Validate(assertion *Assertion) error {
    // 注释掉或修改时间验证
    // if err := sp.validateConditions(assertion.Conditions); err != nil {
    //     return err
    // }
    return nil
}

然后,在你的项目中引用本地修改后的版本(在go.mod中使用replace指令)。

注意事项

根据你的具体需求,选择最适合的库并进行定制。如果有更多细节(如SAML角色或协议版本),可以提供更精确的示例。

回到顶部