Research
Security News
Malicious npm Packages Inject SSH Backdoors via Typosquatted Libraries
Socket’s threat research team has detected six malicious npm packages typosquatting popular libraries to insert SSH backdoors.
github.com/ufilesdk-dev/ufile-gosdk
Modules are interface and implementation.
The best modules are where interface is much simpler than implementation.
By: John Ousterhout
在对象存储系统中,存储空间(Bucket)是文件(File)的组织管理单位,文件(File)是存储空间的逻辑存储单元。对于每个账号,该账号里存放的每个文件都有唯一的一对存储空间(Bucket)与键(Key)作为标识。我们可以把 Bucket 理解成一类文件的集合,Key 理解成文件名。由于每个 Bucket 需要配置和权限不同,每个账户里面会有多个 Bucket。在 US3 里面,Bucket 主要分为公有和私有两种,公有 Bucket 里面的文件可以对任何人开放,私有 Bucket 需要配置对应访问签名才能访问。
本 SDK 接口是基于 HTTP 的,为了连接的安全性,US3 使用 HMAC SHA1 对每个连接进行签名校验。使用本 SDK 可以忽略签名相关的算法过程,只要把公私钥写入到配置文件里面,读取并传给 UFileRequest 里面的 New 方法即可。签名相关的算法与详细实现请见 Auth 模块
{
"说明1":"管理 bucket 创建和删除必须要公私钥(见 https://console.ucloud.cn/uapi/apikey),如果只做文件上传和下载用 TOEKN (见 https://console.ucloud.cn/ufile/token)就够了,为了安全,强烈建议只使用 TOKEN 做文件管理",
"public_key":"",
"private_key":"",
"说明2":"以下两个参数是用来管理文件用的。对应的是 file.go 里面的接口,file_host 是不带 bucket 名字的。比如:北京地域的host填cn-bj.ufileos.com,而不是填 bucketname.cn-bj.ufileos.com。若为自定义域名,请直接带上 http 开头的 URL。如:http://example.com",
"bucket_name":"",
"file_host":"",
"说明3":"verifyUploadMD5 用于数据完整性校验,默认不开启,若要开启请置为true",
"verifyUploadMD5": false
}
密钥可以在控制台中 API 产品 - API 密钥,点击显示 API 密钥获取。将 public_key 和 private_key 分别赋值给相关变量后,SDK即可通过此密钥完成鉴权。请妥善保管好 API 密钥,避免泄露。 token(令牌)是针对指定bucket授权的一对公私钥。可通过token进行授权bucket的权限控制和管理。可以在控制台中对象存储US3-令牌管理,点击创建令牌获取。
go run demo.go
在您的项目代码中,使用import ufsdk "github.com/ufilesdk-dev/ufile-gosdk"
引入US3 Go SDK的包
// 加载配置,创建请求
config, err := ufsdk.LoadConfig("config.json")
if err != nil {
panic(err.Error())
}
req, err := ufsdk.NewBucketRequest(config, nil)
if err != nil {
panic(err.Error())
}
bucketRet, err := req.CreateBucket("BucketName", "Region", "BucketType", "ProjectId")
if err != nil {
log.Fataf("创建 bucket 出错,错误信息为:%s\n", err.Error())
}
// 加载配置,创建请求
config, err := ufsdk.LoadConfig("config.json")
if err != nil {
panic(err.Error())
}
req, err := ufsdk.NewBucketRequest(config, nil)
if err != nil {
panic(err.Error())
}
bucketList, err := req.DescribeBucket("BucketName", Offset, Limit, "ProjectId")
if err != nil {
log.Println("获取 bucket 信息出错,错误信息为:", err.Error())
}
// 加载配置,创建请求
config, err := ufsdk.LoadConfig("config.json")
if err != nil {
panic(err.Error())
}
req, err := ufsdk.NewBucketRequest(config, nil)
if err != nil {
panic(err.Error())
}
bucketRet, err = req.UpdateBucket("BucketName", "BucketType", "ProjectId")
if err != nil {
log.Println("更新 bucket 信息失败,错误信息为:", err.Error())
}
// 加载配置,创建请求
config, err := ufsdk.LoadConfig("config.json")
if err != nil {
panic(err.Error())
}
req, err := ufsdk.NewBucketRequest(config, nil)
if err != nil {
panic(err.Error())
}
bucketRet, err = req.DeleteBucket("BucketName", "ProjectId")
if err != nil {
log.Fataf("删除 bucket 失败,错误信息为:", err.Error())
}
// 加载配置,创建请求
config, err := ufsdk.LoadConfig("config.json")
if err != nil {
panic(err.Error())
}
req, err := ufsdk.NewFileRequest(config, nil)
if err != nil {
panic(err.Error())
}
err = req.PutFile("FilePath", "KeyName", "MimeType")
if err != nil {
log.Println("DumpResponse:", string(req.DumpResponse(true)))
}
// 加载配置,创建请求
config, err := ufsdk.LoadConfig("config.json")
if err != nil {
panic(err.Error())
}
req, err := ufsdk.NewFileRequest(config, nil)
if err != nil {
panic(err.Error())
}
err = req.PostFile("FilePath", "KeyName", "MimeType")
if err != nil {
log.Println("DumpResponse:", string(req.DumpResponse(true)))
}
if err != nil {
log.Fatal(err.Error())
}
req, err := ufsdk.NewFileRequest(config, nil)
if err != nil {
log.Fatal(err.Error())
}
// 流式上传本地小文件
f, err := os.Open("FilePath")
if err != nil {
panic(err.Error())
}
err = req.IOPut(f, "KeyName", "")
f.Close()
if err != nil {
log.Fatalf("%s\n", req.DumpResponse(true))
}
// 流式上传大文件
f1, err := os.Open("FilePath1")
if err != nil {
panic(err.Error())
}
err = req.IOMutipartAsyncUpload(f1, "KeyName", "")
f1.Close()
if err != nil {
log.Fatalf("%s\n", req.DumpResponse(true))
}
// 加载配置,创建请求
config, err := ufsdk.LoadConfig("config.json")
if err != nil {
panic(err.Error())
}
req, err := ufsdk.NewFileRequest(config, nil)
if err != nil {
panic(err.Error())
}
err = req.MPut("FilePath", "KeyName", "MimeType")
if err != nil {
log.Println("DumpResponse:", string(req.DumpResponse(true)))
}
// 加载配置,创建请求
config, err := ufsdk.LoadConfig("config.json")
if err != nil {
panic(err.Error())
}
req, err := ufsdk.NewFileRequest(config, nil)
if err != nil {
panic(err.Error())
}
// 同步分片上传回调
err = req.MPutWithPolicy("FilePath", "KeyName", "MimeType", "Policy")
if err != nil {
log.Println("DumpResponse:", string(req.DumpResponse(true)))
}
// 异步分片上传回调
err = req.AsyncMPutWithPolicy("FilePath", "KeyName", "MimeType", "Policy")
if err != nil {
log.Println("DumpResponse:", string(req.DumpResponse(true)))
}
// 异步分片并发上传回调
jobs := 20 // 并发数为 20
err = req.AsyncUploadWithPolicy("FilePath", "KeyName", "MimeType", jobs, "Policy")
if err != nil {
log.Println("DumpResponse:", string(req.DumpResponse(true)))
}
// 加载配置,创建请求
config, err := ufsdk.LoadConfig("config.json")
if err != nil {
panic(err.Error())
}
req, err := ufsdk.NewFileRequest(config, nil)
if err != nil {
panic(err.Error())
}
// 普通下载
err = req.Download("DownLoadURL")
if err != nil {
log.Println("DumpResponse:", string(req.DumpResponse(true)))
}
// 流式下载
err = req.Download("buffer", "KeyName")
if err != nil {
log.Println("DumpResponse:", string(req.DumpResponse(true)))
}
config, err := ufsdk.LoadConfig("config.json")
if err != nil {
panic(err.Error())
}
req, err := ufsdk.NewFileRequest(config, nil)
if err != nil {
panic(err.Error())
}
err = req.HeadFile("KeyName")
if err != nil {
log.Println("DumpResponse:", string(req.DumpResponse(true)))
}
config, err := ufsdk.LoadConfig("config.json")
if err != nil {
panic(err.Error())
}
req, err := ufsdk.NewFileRequest(config, nil)
if err != nil {
panic(err.Error())
}
err = req.DeleteFile("KeyName")
if err != nil {
log.Println("DumpResponse:", string(req.DumpResponse(true)))
}
config, err := ufsdk.LoadConfig("config.json")
if err != nil {
panic(err.Error())
}
req, err := ufsdk.NewFileRequest(config, nil)
if err != nil {
panic(err.Error())
}
err = req.Restore("KeyName")
if err != nil {
log.Println("DumpResponse:", string(req.DumpResponse(true)))
}
config, err := ufsdk.LoadConfig("config.json")
if err != nil {
panic(err.Error())
}
req, err := ufsdk.NewFileRequest(config, nil)
if err != nil {
panic(err.Error())
}
err = req.ClassSwitch("KeyName", "StorageClass")
if err != nil {
log.Println("DumpResponse:", string(req.DumpResponse(true)))
}
config, err := ufsdk.LoadConfig("config.json")
if err != nil {
panic(err.Error())
}
req, err := ufsdk.NewFileRequest(config, nil)
if err != nil {
panic(err.Error())
}
err = req.CompareFileEtag("KeyName", "FilePath")
if err != nil {
log.Println("DumpResponse:", string(req.DumpResponse(true)))
}
config, err := ufsdk.LoadConfig("config.json")
if err != nil {
panic(err.Error())
}
req, err := ufsdk.NewFileRequest(config, nil)
if err != nil {
panic(err.Error())
}
err = req.Copy("DstkeyName", "SrcBucketName", "SrcKeyName")
if err != nil {
log.Println("DumpResponse:", string(req.DumpResponse(true)))
}
config, err := ufsdk.LoadConfig("config.json")
if err != nil {
panic(err.Error())
}
req, err := ufsdk.NewFileRequest(config, nil)
if err != nil {
panic(err.Error())
}
list, err := req.PrefixFileList("Prefix", "Marker", "Limit")
if err != nil {
log.Println("DumpResponse:", string(req.DumpResponse(true)))
}
config, err := ufsdk.LoadConfig("config.json")
if err != nil {
panic(err.Error())
}
req, err := ufsdk.NewFileRequest(config, nil)
if err != nil {
panic(err.Error())
}
list, err := req.ListObjects("Prefix", "Marker", "Delimiter", "MaxKeys")
if err != nil {
log.Println("DumpResponse:", string(req.DumpResponse(true)))
}
本 SDK 使用 godoc 约定的方法对每个 export 出来的接口进行注释。 你可以直接访问生成好的在线文档。
FAQs
Unknown package
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Research
Security News
Socket’s threat research team has detected six malicious npm packages typosquatting popular libraries to insert SSH backdoors.
Security News
MITRE's 2024 CWE Top 25 highlights critical software vulnerabilities like XSS, SQL Injection, and CSRF, reflecting shifts due to a refined ranking methodology.
Security News
In this segment of the Risky Business podcast, Feross Aboukhadijeh and Patrick Gray discuss the challenges of tracking malware discovered in open source softare.