作为初学者,我如何知道 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?
正如 Sergio Tulentsev 在评论中提到的,要使(生产)Rails 应用程序安全抵御现实世界的威胁,需要强大的专业知识。
现在,如果您正处于学习过程中,并且想了解是什么让您的应用容易受到攻击,以及您可以如何解决每一个问题,我建议您查看以下安全清单之一:
- Ruby on Rails Cheatsheet 在 owasp.org
- Free RoR Security Checklist,Rahoul Baruah 在 theartandscienceofruby.com 上发表(需要注册他们的时事通讯)
几乎所有的网络服务应用程序都使用相同的安全协议,换句话说,用户必须输入密码才能访问他们的东西,有些已经实现了两步验证——这确实有很大帮助。
根据您构建的内容,一切都遵循一些核心安全基础架构。
甚至像 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 申请越来越近了。
我正在查看 Rails 并且即将学习创建用户和身份验证。我想知道作为初学者,您如何知道所遵循的教程或您使用的技术是否足以安全 public 使用?
是否有一套被普遍认为安全的标准?使数据库安全比我想象的更容易吗?
如果您想构建支付功能怎么办,如果不是安全专家,您怎么知道它是否安全?
您可以阅读这些文章,建立对自己的信心。
Best payment gateways and Rails gems for secure payments?
正如 Sergio Tulentsev 在评论中提到的,要使(生产)Rails 应用程序安全抵御现实世界的威胁,需要强大的专业知识。
现在,如果您正处于学习过程中,并且想了解是什么让您的应用容易受到攻击,以及您可以如何解决每一个问题,我建议您查看以下安全清单之一:
- Ruby on Rails Cheatsheet 在 owasp.org
- Free RoR Security Checklist,Rahoul Baruah 在 theartandscienceofruby.com 上发表(需要注册他们的时事通讯)
几乎所有的网络服务应用程序都使用相同的安全协议,换句话说,用户必须输入密码才能访问他们的东西,有些已经实现了两步验证——这确实有很大帮助。
根据您构建的内容,一切都遵循一些核心安全基础架构。
甚至像 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 申请越来越近了。