安全过滤 Active Storage 文件名?
Safely filter Active Storage file names?
Securing Rails Applications rails 指南(文件上传部分)给出了 4 个很棒的段落,说明盲目接受用户文件的危险。一些亮点:
If you store file uploads at /var/www/uploads, and the user enters a file name like "../../../etc/passwd", it may overwrite an important file.
It is best to use a permitted list approach, which checks for the validity of a file name with a set of accepted characters. This is opposed to a restricted list approach which attempts to remove not allowed characters.
假设开发人员以最小的方式设置了 Active Storage 以使用他们的应用程序,他们将如何确保文件名正确escaped/sanitized/rejected(在此处接受有关最佳策略的建议)
到目前为止我所知道的
rails 指南显示了这段代码,但仅作为示例提供,没有太多关于它是否是最佳实践的评论
def sanitize_filename(filename)
filename.strip.tap do |name|
# NOTE: File.basename doesn't work right with Windows paths on Unix
# get only the filename, not the whole path
name.sub! /\A.*(\|\/)/, ''
# Finally, replace all non alphanumeric, underscore
# or periods with underscore
name.gsub! /[^\w\.\-]/, '_'
end
end
该代码是否足以防止已知文件名攻击?或者有更好的方法吗?
用法示例
不知道上面的方法具体怎么用
假设我们有以下表单来提交图片:
<%= f.label "Select one or more images" %>
<%= f.file_field :teacher_images, multiple: true %>
我不确定 sanitize_filename
究竟如何适应这个
可以肯定地说,它可以安全地抵御依赖于 ..
用于将文件保存在另一个目录中的特定攻击。但是,没有已知漏洞的独家列表,它可能无法防止潜在的漏洞,这些漏洞可能特定于实际存储文件的任何后端。
例如,如果所有上传都存储在同一目录中,恶意用户可能会覆盖其他用户上传的内容。
真正 100% 安全地抵御已知和未来攻击的唯一方法是不接受用户的文件名并在服务器上生成它们,这是由 ActiveStorage 完成的。
Securing Rails Applications rails 指南(文件上传部分)给出了 4 个很棒的段落,说明盲目接受用户文件的危险。一些亮点:
If you store file uploads at /var/www/uploads, and the user enters a file name like "../../../etc/passwd", it may overwrite an important file.
It is best to use a permitted list approach, which checks for the validity of a file name with a set of accepted characters. This is opposed to a restricted list approach which attempts to remove not allowed characters.
假设开发人员以最小的方式设置了 Active Storage 以使用他们的应用程序,他们将如何确保文件名正确escaped/sanitized/rejected(在此处接受有关最佳策略的建议)
到目前为止我所知道的
rails 指南显示了这段代码,但仅作为示例提供,没有太多关于它是否是最佳实践的评论
def sanitize_filename(filename)
filename.strip.tap do |name|
# NOTE: File.basename doesn't work right with Windows paths on Unix
# get only the filename, not the whole path
name.sub! /\A.*(\|\/)/, ''
# Finally, replace all non alphanumeric, underscore
# or periods with underscore
name.gsub! /[^\w\.\-]/, '_'
end
end
该代码是否足以防止已知文件名攻击?或者有更好的方法吗?
用法示例
不知道上面的方法具体怎么用
假设我们有以下表单来提交图片:
<%= f.label "Select one or more images" %>
<%= f.file_field :teacher_images, multiple: true %>
我不确定 sanitize_filename
究竟如何适应这个
可以肯定地说,它可以安全地抵御依赖于 ..
用于将文件保存在另一个目录中的特定攻击。但是,没有已知漏洞的独家列表,它可能无法防止潜在的漏洞,这些漏洞可能特定于实际存储文件的任何后端。
例如,如果所有上传都存储在同一目录中,恶意用户可能会覆盖其他用户上传的内容。
真正 100% 安全地抵御已知和未来攻击的唯一方法是不接受用户的文件名并在服务器上生成它们,这是由 ActiveStorage 完成的。