如何安全下载文件

尼丁

以下方法用于根据用户参数/选择下载YAML文件。

这肯定是不安全的,因为我可以下载层次结构中的其他YAML文件。

def download

    language_code = params[:code]
    send_file(
        "#{Rails.root}/config/locales/#{language_code}.yml",
        filename: "#{language_code}.yml",
        type: "application/yml"
    )

end

我无法把握params[:code]自然是动态的。

如何在download这里保护易受攻击方法?

加文·米勒

正如注释所暗示的那样,您的#1选项是完全禁止用户与language_code字符串进行交互注释中有许多建议的选项:受限列表,数据库实现等。

另一个选择(尽管考虑到您的约束,这可能无效)是进行长度检查:language_code.length <= 4假设您的语言代码不超过Wikipedia的语言代码列表中的4个字符

作为最后的选择,您还可以清理用户输入并清理它,以使文件路径无法被操纵。我在这里写了一篇有关文件清理功能的文章您有两种选择:

  • 白名单,并且只接受一小部分字符: A-Z, a-z, 0-9
  • 黑名单并消除危险人物: / \ ? % * : | " < > . (and space)

对于您的情况(我假设您完全控制config/locals),我会将其列入白名单。白名单功能易于创建:

def sanitize(file_name)
  # Remove any character that aren't 0-9, A-Z, or a-z
  filename.gsub(/[^0-9A-Z]/i, '_')
end

不知道您的语言文件是如何实现的,您可能需要使用下划线以外的字符_进行替换。

为了额外的预防措施,您还可以预先检查目录以查看文件是否存在,以防止路径遍历攻击。像这样:

def valid_path?(filename)
  Dir["#{Rails.root}/config/locales/*"].include?("#{Rails.root}/config/locales/#{filename}")
end

这样做的好处是,您明确声明文件在config/locales提供之前必须存在于目录中。如果攻击者尝试进行目录遍历攻击,则此函数将返回false。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

硒未完全下载文件

来自分类Dev

使用Blazor Webassembly和ASP.NET Core安全下载文件

来自分类Dev

如何在没有安全下载管理器(SDM)的情况下下载软件?如何打开.sdx文件?

来自分类Dev

如何下载文件

来自分类Dev

如何下载文件?

来自分类Dev

您如何判断文件是否通过HTTP完全下载?

来自分类Dev

即使安全下载也上传校验和?

来自分类Dev

如何从HTTPResponseMessage下载文件

来自分类Dev

如何快速下载文件?

来自分类Dev

如何从gridview下载文件?

来自分类Dev

如何让人们下载文件

来自分类Dev

如何点击下载文件

来自分类Dev

如何生成安全的临时URL以从Amazon S3下载文件?

来自分类Dev

如何在Shell脚本中安全地下载文件?

来自分类Dev

如何使用python查找文件是否已完全下载?

来自分类Dev

如何使用restsharp下载文件

来自分类Dev

如何从http url下载文件?

来自分类Dev

如何使用C从http下载文件?

来自分类Dev

如何在Watir中下载文件?

来自分类Dev

如何从Heroku bash下载文件?

来自分类Dev

如何在webView中下载文件?

来自分类Dev

如何使用硒下载文件?

来自分类Dev

如何从git仓库下载文件?

来自分类Dev

如何从115.com下载文件?

来自分类Dev

如何在Codeigniter中下载文件?

来自分类Dev

如何使用锚标记<a>下载文件

来自分类Dev

如何从Webview Android下载文件?

来自分类Dev

如何使用jQuery下载文件?

来自分类Dev

如何使用Cowboy下载文件?