作为初学者,我如何知道 Web 应用程序是否安全

As a beginner how do I know if a web app is secure

我正在查看 Rails 并且即将学习创建用户和身份验证。我想知道作为初学者,您如何知道所遵循的教程或您使用的技术是否足以安全 public 使用?

是否有一套被普遍认为安全的标准?使数据库安全比我想象的更容易吗?

如果您想构建支付功能怎么办,如果不是安全专家,您怎么知道它是否安全?

您可以阅读这些文章,建立对自己的信心。

Best payment gateways and Rails gems for secure payments?

Ruby on Rails Security Guide

正如 Sergio Tulentsev 在评论中提到的,要使(生产)Rails 应用程序安全抵御现实世界的威胁,需要强大的专业知识。

现在,如果您正处于学习过程中,并且想了解是什么让您的应用容易受到攻击,以及您可以如何解决每一个问题,我建议您查看以下安全清单之一:

几乎所有的网络服务应用程序都使用相同的安全协议,换句话说,用户必须输入密码才能访问他们的东西,有些已经实现了两步验证——这确实有很大帮助。

根据您构建的内容,一切都遵循一些核心安全基础架构。

甚至像 Facebook 和 Google 这样的网站也被黑了。有些软件是逆向工程的。

我曾经想过:你能对黑客做些什么吗?答案是否定的。除了修复软件中的错误和安全漏洞,并希望一切顺利。

即使是最顶尖的计算机安全专家也无能为力。

快速 Google 搜索给了我这个:

Techniques to Secure Your Website with Ruby On Rails (Part 1)

@darkace: 这里有一些额外的建议,如果你想构建你梦想中的网络服务,那就去做吧。 Facebook 的安全性很差,在早期,他们将未散列的密码存储在 *.txt 文件中。任何能够以某种方式访问​​ ROOT 目录的人都可以突然访问用户的密码和电子邮件,而不是 Facebook 员工。

然而,如今,Facebook 已成为一家市值十亿美元的公司,聘请了许多安全专家,并加强并保护了其服务器基础设施。

一旦您的应用程序服务产生现金,您就可以进行投资以确保其安全。现在不要太担心它。世界上没有黑客关心您的应用程序。你现在太小了,但如果你长大并从中赚到数百万美元,黑客就会来找你的软件。

以下是应用程序投入生产前需要检查的事项列表:

身份验证

您可能正在使用 Devise 进行身份验证。这是一个很好的开始。与身份验证没有直接关系,但请确保您没有在 session 中存储任何秘密(session[…] 在 Rails 中)。还要注意存在重放攻击(请参阅 Rails 安全指南,重放攻击部分),因此请考虑在 session.

中存储的内容

授权

取决于您的应用程序的大小,但如果不断增长,请使用像 CanCanCan 或 Pundit 这样的授权 gem。这通常工作得很好,并且有很多示例应用程序。但是,当您拥有多层所有权时(如 projects/2/documents/5),请确保不仅 parent object 属于此用户(项目 2 属于此当前用户example),而且这个 child object 属于 parent object(示例中文档 5 属于项目 2)。这种类型的检查是一个常见问题。

服务器

SSL: 如果你使用 HTTPS,一个严肃的应用程序可能应该使用,然后确保它在任何地方都被使用,它是 HTTPS-only 并通过 SSLlabs 检查服务器配置。

HTTP headers: 确保您了解使用 Rails 发送的默认 HTTP headers 做什么,请参阅 Rails 安全指南,第 9 节默认值 headers。

路由:不要使用默认路由:匹配':controller(/:action(/:id(.:format)))'并确保所有路由只能通过一个 HTTP 动词使用。这也用作 CSRF 保护。更像是一个问题的 URL 应该是 HTTP GET,改变应用程序状态的动作应该是 non-GET。请参阅路由 Rails 指南。

数据库配置: 2 个最重要的步骤:使数据库服务器只能在本地主机上访问(搜索 google mysql 仅本地主机)。并使用 GRANT SQL 语法在数据库级别限制 Rails 数据库用户的权限(搜索 "mysql grant")。

日志记录: 不要在您的日志文件中记录秘密,将 Rails.application.config.filter_parameters 添加到您的配置中并包括像 :password.

这样的属性

XSS

这是一个非常广泛的话题,但您可能已经知道 Rails 会自动转义视图中的 "unsafe" 字符串,因此来自用户或数据库的所有内容。使用 raw() 方法或在方法中自己构造 HTML 时要非常小心。来自用户的一切都可能存在安全风险。事实上,这是帐户获得 "hacked".

的首要原因

渲染

不要在 render() 方法中直接或间接使用参数。

API或XML/JSON渲染

您在控制器中使用 respond_to 吗?如果是这样,请检查每个操作是否响应 .xml 或 .json 版本,因为您在此处呈现的信息可能太多。每当您调用 model.to_xml 或 model.to_json(也通过 respond_with 间接调用)时,您可能正在泄露秘密或太多了。

重定向

使用 redirect_to 时,确保不要直接使用用户参数,也不要使用其中的一部分。如果您需要动态重定向,请将所有允许的目标列入白名单或使用正则表达式进行检查,例如参数[:back_url] =~ %r(\A#{home_url})

CSRF

您的应用程序应该可以抵御 CSRF,阅读相关内容(请参阅 Rails 安全指南,CSRF 部分)并尝试通过篡改您将在每个 Rails表格.

文件上传

上传的文件可能包含指示的文件扩展名之外的其他内容(PNG 图像中的 HTML 评论就是一个著名的例子)。确保验证允许的内容类型(例如,仅允许 PNG)并尽可能将文件作为附件发送(参见 send_file 方法,:disposition 选项)。最好的选择是将上传的文件存储在不同的服务器上,以防文件中存在XSS。

一般

正则表达式:不要使用^和$来匹配字符串的开头和结尾,而是使用\A、\z。

数据库

秘密:您有三种存储值的选项:明文、加密哈希(one-way,无法再检索原始文本)、加密值。密码应以散列形式存储(Devise 会为您做到这一点),在最坏的情况下,任何其他秘密字段都应加密(例如使用 attr_encrypted)。

SQL 注射

Rails 可以很好地防止 SQLi,但您必须记住以下几点: * 切勿在字符串变形中使用 user-supplied 值,例如 User.delete_all("id = #{params[:id]}") * 在 http://rails-sqli.org/

检查所有其他示例的代码

支付功能

如果您是初学者,请确保尽可能少地使用它。使用 gem 和支付ent 提供商,他们确保付款详细信息永远不会通过您的服务器。

Long-term策略

我建议留下 up-to-date,自己不断测试安全性,制定自己的安全策略,为最坏的情况做好准备,并 运行 进行一些自动安全检查。一些提示如何在你没有时间的时候处理所有这些,I've summarized here。 然后你离 production-ready 申请越来越近了。