我正在工作的 Django 应用程序有一个 Event 模型。 Event 可能有关联的照片、静态 html 文件和 pdf 文件。
我希望允许受信任的用户上传这些文件,但我对安全性持谨慎态度,尤其是阅读了以下 in the Django docs (链接)。
Note that whenever you deal with uploaded files, you should pay close attention to where you're uploading them and what type of files they are, to avoid security holes. Validate all uploaded files so that you're sure the files are what you think they are. For example, if you blindly let somebody upload files, without validation, to a directory that's within your Web server's document root, then somebody could upload a CGI or PHP script and execute that script by visiting its URL on your site. Don't allow that.
如何验证不同类型的文件?我很想听听任何人处理这种事情的经验,或进一步阅读的链接。我有一种直觉,html文件可能太冒险了,在这种情况下,我会将上传权限限制为管理员。
最佳答案
所有答案都集中在验证文件上。这几乎是不可能的。
Django 开发人员不会要求您验证文件是否可以作为 cgi 文件执行。他们只是告诉你不要把他们放在他们将处决的地方。
你应该把所有 Django 的东西放在一个专门的 Django 目录中。该 Django 代码目录不应包含静态内容。 不要将用户文件放在 Django 源代码库中。
如果您使用的是 Apache2,请查看基本 cgi 教程:http://httpd.apache.org/docs/2.0/howto/cgi.html
Apache2 可能设置为运行 ScriptAlias 文件夹中的任何文件。 不要将用户文件放在 /cgi-bin/ 或 /usr/local/apache2/cgi-bin/ 文件夹中。
Apache2 可能设置为服务器 cgi 文件,具体取决于 AddHandler cgi-script 设置。 不要让用户提交带有 .cgi 或 .pl 等扩展名的文件。
但是,您确实需要清理用户提交的文件,以便它们可以安全地在其他客户的计算机上运行。 提交的 HTML 对其他用户不安全。它不会损害您的服务器。您的服务器只会将其吐回给任何请求它的人。获取 HTML 清理程序。
另外,SVG 可能不安全。它过去有错误。 SVG 是一个包含 javascript 的 XML 文档,因此它可能是恶意的。
PDF 是……棘手的。您可以将其转换为图像(如果您确实需要),或提供图像预览(并让用户自行承担下载风险),但这对于尝试使用它的人来说会很痛苦。
考虑一个正常文件的白名单。嵌入在 gif、jpeg 或 png 文件中的病毒看起来就像一张损坏的图片(或无法显示)。如果您想偏执,请使用 PIL 将它们全部转换为标准格式(嘿,您还可以检查尺寸)。净化的 HTML 应该没问题(去掉脚本标签不是火箭科学)。如果清理过程很糟糕(或者你只是小心翼翼),我猜你可以把它放在一个单独的服务器上。
关于python - 在 Django 中验证上传的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1745743/
我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看rubyzip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d
我试图在一个项目中使用rake,如果我把所有东西都放到Rakefile中,它会很大并且很难读取/找到东西,所以我试着将每个命名空间放在lib/rake中它自己的文件中,我添加了这个到我的rake文件的顶部:Dir['#{File.dirname(__FILE__)}/lib/rake/*.rake'].map{|f|requiref}它加载文件没问题,但没有任务。我现在只有一个.rake文件作为测试,名为“servers.rake”,它看起来像这样:namespace:serverdotask:testdoputs"test"endend所以当我运行rakeserver:testid时
我的目标是转换表单输入,例如“100兆字节”或“1GB”,并将其转换为我可以存储在数据库中的文件大小(以千字节为单位)。目前,我有这个:defquota_convert@regex=/([0-9]+)(.*)s/@sizes=%w{kilobytemegabytegigabyte}m=self.quota.match(@regex)if@sizes.include?m[2]eval("self.quota=#{m[1]}.#{m[2]}")endend这有效,但前提是输入是倍数(“gigabytes”,而不是“gigabyte”)并且由于使用了eval看起来疯狂不安全。所以,功能正常,
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
Rails2.3可以选择随时使用RouteSet#add_configuration_file添加更多路由。是否可以在Rails3项目中做同样的事情? 最佳答案 在config/application.rb中:config.paths.config.routes在Rails3.2(也可能是Rails3.1)中,使用:config.paths["config/routes"] 关于ruby-on-rails-Rails3中的多个路由文件,我们在StackOverflow上找到一个类似的问题
给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru
我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..
对于具有离线功能的智能手机应用程序,我正在为Xml文件创建单向文本同步。我希望我的服务器将增量/差异(例如GNU差异补丁)发送到目标设备。这是计划:Time=0Server:hasversion_1ofXmlfile(~800kiB)Client:hasversion_1ofXmlfile(~800kiB)Time=1Server:hasversion_1andversion_2ofXmlfile(each~800kiB)computesdeltaoftheseversions(=patch)(~10kiB)sendspatchtoClient(~10kiBtransferred)Cl
我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚
使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta