- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我有带有 json 的 test.gzip
文件
{"events": [
{"uuid":"56c1718c-8eb3-11e9-8157-e4b97a2c93d3",
"timestamp":"2019-06-14 14:47:31 +0000",
"number":732,
"user": {"full_name":"0"*1024*1024*1024}}]}
full_name 文件包含 1GB 的 0
,压缩文件大小 ~1Mb
如何在解包时保护我的服务,使我的内存不至于结束?
func ReadGzFile(filename string) ([]byte, error) {
fi, err := os.Open(filename)
if err != nil {
return nil, err
}
defer fi.Close()
fz, err := gzip.NewReader(fi)
if err != nil {
return nil, err
}
defer fz.Close()
s, err := ioutil.ReadAll(fz)
if err != nil {
return nil, err
}
return s, nil
}
func main() {
b, err := ReadGzFile("test.gzip")
if err != nil {
log.Println(err)
}
var dat map[string]interface{}
if err := json.Unmarshal(b, &dat); err != nil {
panic(err)
}
fmt.Println(dat)
}
在这种情况下,输出会被 OOMKiller 杀死我的服务
最佳答案
可能具有欺骗性的是,压缩后的大小可能明显小于允许的大小(您可以或希望处理的大小)。在您的示例中,输入约为 1 MB,而未压缩的大小约为 1 GB。
在读取未压缩 数据时,您应该在达到合理限制后停止。要轻松做到这一点,您可以使用 io.LimitReader()
您可以在其中指定要读取的最大字节数。是的,您必须包装解压缩 流,而不是原始压缩流。
这是一个示例:
limited := io.LimitReader(fz, 2*1024*1024)
s, err := ioutil.ReadAll(limited)
以上示例将可读数据限制为 2 MB。当解压缩的数据多于此时会发生什么? io.LimitReader()
(顺便说一句 io.LimitedReader
)返回的 io.Reader
将报告 io.EOF
。这可以保护您的服务器免受攻击,但可能不是处理攻击的最佳方式。
既然你提到这是一个休息 API,一个更合适的解决方案是类似的 http.MaxBytesReader()
.这会包装传递的读取器以读取直到给定限制,如果达到限制,它会返回一个错误,并将错误发送回 HTTP 客户端,并关闭底层的读取关闭器。如果http.MaxBytesReader()
的默认行为不适合你,查看它的来源,复制它并修改它,它相对简单。根据您的需要进行调整。
另请注意,您不应将所有内容(未压缩的数据)读入内存。您可以将“有限读者”传递给json.NewDecoder()
它将在解码输入 JSON 时从给定的阅读器读取。当然如果通过的limited reader报错,则解码失败。
关于json - 如何保护服务免受 gzip 炸弹的攻击?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56629115/
我正在尝试进行一些高度递归的模拟和数学运算,在某些边缘情况下,我会溢出调用堆栈并获得 EXC_BAD_ACCESS 信号。将算法更改为迭代形式是不可行的,因为它是很多遗留代码。并且递归深度限制没有用,
我们有一堆调用 Python C/C++ 绑定(bind)的测试。我们用 Nose 运行这些测试: nosetests myapp ..... ----------------------------
关闭。这个问题需要更多focused .它目前不接受答案。 想改善这个问题吗?更新问题,使其仅关注一个问题 editing this post . 5年前关闭。 Improve this questi
我对不使用 SSL 保护 PHP session 的主题很感兴趣。 令我惊讶的是,如果中间人嗅探用户和服务器之间交换的数据包,即使已通过身份验证,也很容易窃取 session 。我知道有一些策略可以限
我对不使用 SSL 保护 PHP session 的主题很感兴趣。 令我惊讶的是,如果中间人嗅探用户和服务器之间交换的数据包,即使已通过身份验证,也很容易窃取 session 。我知道有一些策略可以限
我正在创建一个 API,下面的方法通过查询参数中的员工姓名或所有员工获取员工。但是,[FromQuery(Name = "name")] 是否可以防止 SQL 注入(inject),不确定这是否是 .
我想保护我的应用免受 XSS 攻击。我可以使用任何开箱即用的功能吗?一个外部库来保护整个应用程序的请求?还是 Tomcat 过滤器/阀? 谢谢! 最佳答案 您可以使用的选项: > Java Encod
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
这个问题在这里已经有了答案: How to prevent spoofing of DLLs in .NET (2 个答案) 关闭 7 年前。 我想保护我的 DLL 不被修补程序修改。听说对DLL进
我刚刚在我的 Azure Web 应用程序上安装了 SSL 证书。我已使用可用的 Symantec SSL 检查器工具检查安装是否正确 here . 在结果中我可以读到 BEAST This serv
我正在为一组网站设计 API。这些站点非常相似(有点像 StackOverflow、SuperUser 和 ServerFault),它们有一个共享的后端是有意义的。因此,我们决定尝试使用一个很好的
我正在开发一个使用 SQLite 作为数据库管理系统的 PHP 应用程序,MySQL 和 PostgreSQL 等不是替代方案(尽管我真的很想使用 pgsql),因为我希望设置对初学者非常友好并且为零
我们使用 native Apache Portable Runtime SSL 连接器在 Tomcat 6 上运行 Web 应用程序以提供 SSL 连接。我们如何配置服务器以防止 BEAST 攻击?。
我有一个聊天窗口(使用 )有时需要获取多行条目。到现在为止,我只是简单地替换了传入的 \n与 并显示带有 .append() 的文本.不幸的是,我发现留下一个裸体 .append()基于用户输入允许
我已经研究过这个主题,但找不到任何相关信息 我们是否需要采取任何安全措施来保护 javax.xml.transform.Transformer 免受 XML 外部实体攻击? 我做了以下,它似乎扩展了
例如,我有一个用 Node.js 编写的 REST api 端点。非技术用户可以从网页访问,也可以使用 curl 命令通过命令行访问。它不需要任何凭据即可访问它,因为它旨在对任何人开放以供访问。我要解
我托管了我的博客 Amazon Web Services S3(托管静态文件)。我是否应该添加任何策略或措施来进一步保护我的帐户免受 DDoS/高带宽消耗? 最佳答案 我认为这是一场音乐会。不是在技术
我有一个网站使用数据库为网站用户存储信息。所有 mysql 数据库调用都是 SELECT。我使用 $_GET 将变量从一个页面传递到另一个页面,然后在 mysql SELECT 调用中使用这些变量。我
我刚读过 http://www.ruby-lang.org/en/news/2013/02/06/rdoc-xss-cve-2013-0256/ ,关于 RDoc 中 XSS 攻击的报告。 我使用的是
我正在处理一个相当复杂的数学库,当客户端代码使用 auto 时,我发现了一个令人讨厌的错误。在创建一个最小的复制案例来询问有关它的问题的过程中,我意识到我可以单独使用标准库来复制类似的东西。看这个简单
我是一名优秀的程序员,十分优秀!