ASP.NET MVC安全清单

时间:2010-02-02 12:20:54

标签: asp.net-mvc security

有很多关于设计和开发安全性的好文章(甚至是关于SO的一堆帖子),但所有这些文章似乎都集中在你应该做的 上。

然而,我所追求的是一个像黑客一样的思维清单。完成开发后应该完成的简单操作列表,以确保解决方案的安全性。

(更新:我最感兴趣的是黑盒清单 - “转到某个页面,试试这个和那个”类似的东西,但白盒清单也可能会引起关注。)< / EM>


到目前为止,我已经提出了这个问题:

安全黑盒清单

  • 提交错误/恶意数据(此处示例?),以确保通过javascript验证输入的类型,长度,格式和范围。
  • 关闭客户端验证并重复上述步骤,以确保这一点
    • 您不仅可以使用javascript进行检查,还可以在服务器端进行验证
    • 在服务器上验证输入的类型,长度,格式和范围
    • 免费表格输入已消毒
    • 包含输入的输出使用HtmlEncodeUrlEncode
    • 进行编码
  • 按照http://www.example.com/foo?bar=HugeAmountOfData在查询字符串中插入极大量的数据,以确保约束输入并进行边界检查。
  • 通过GET访问POST操作,以确保“表单提交”操作仅限于POST。
  • 如果适用,请上传大小/格式不正确的文件(大文件,空文件,带有重命名扩展名的可执行文件等),以确保正常处理上传。
  • (如何从UI检查?)确保绝对网址用于导航。
  • 以没有正确权限的用户身份访问URL,以确保通过操作/控制器属性明确测试权限。
  • 访问提供不存在详细信息的URL(如不存在的产品ID,您无权访问的项目等),以确保返回正确的错误(404或403等)。
  • 通过HTTP访问敏感页面,以确保它仅通过HTTPS提供。

安全白盒清单

网络层。

  • 在调试模式下,中断代码以便抛出异常,以确保它安全失败。确保捕获异常并记录详细消息,但不要将信息泄露给客户端。
  • 如果适用,请确保MVC操作仅限于POST / GET,特定用户角色,其他任何内容?
  • 确保POST操作附带[ValidateAntiForgeryToken]属性,以防止跨站点请求伪造攻击。
  • 确保Response.Write(直接或间接)永远不会用于显示用户输入。
  • 确保未在查询字符串或表单字段中传递敏感数据。
  • 确保您的安全决策不依赖于HTTP标头信息。

服务层。

  • 在调试模式下,中断代码以便抛出异常,以确保它安全失败。确保捕获异常并记录详细消息,但不要将信息泄露给客户端。
  • 确保更新数据库中您在交易中操作的任何内容。

数据库层。

  • 确保检索存储过程不使用SELECT *,但始终明确指定列列表。
  • 确保更新/删除存储过程在事务中运行(通过@@TRANCOUNT等)并显式提交/回滚。

评论?更正?缺少步骤?

将其制作社区维基,随意编辑。

4 个答案:

答案 0 :(得分:4)

主要坚持MVC特定的东西:

  • 在ASP.NET 4中,了解<%:MvcHtmlString
  • 尽可能使用HTML帮助程序而不是原始HTML,因为它会增加您记住编码的机会(帮助程序为您执行此操作)
  • 分析JsonRequestBehavior.AllowGet的所有用途,以确保它无法返回数组。
  • 不要重新发明与安全有关的任何事情。使用经过验证,维护,现成的实施。
  • 请勿泄漏robots.txt
  • 中的安全信息

答案 1 :(得分:4)

要添加到列表中:

黑色:DoS攻击 - 使用tinyget或类似模拟DoS攻击,查看您的应用程序的功能。

黑色:规范化攻击。提到了一点,可能是特别关注可以在目录遍历攻击的情况下下载。

白色:使用Cookie来处理敏感信息?请参阅cookie不用于敏感数据,并且不会在意图间隔内本地保留。 黑色:在IE的临时IE / XYZ文件夹中嗅探。

黑色:再次,使用脚本微小或手动尝试查看暴力密码猜测是否有效,或者您的应用是否有智能延迟/拒绝密码猜测攻击。

黑色:执行任何攻击并查看是否自动通知管理员攻击,或者只有攻击者才知道攻击。

“确保您的安全决策不依赖于HTTP标头信息” - http标头用于ntml / kerberos身份验证?可能只是不要愚蠢地使用它们,不发明或依赖引用者等?

概述:使用商用黑/白盒安全扫描仪,价格昂贵,但很难进行安全性回归测试。

答案 2 :(得分:1)

  • 在每个请求(GET或POST或其他请求)上验证用户凭据,以确认用户身份验证

  • 检查每个敏感操作的用户授权(检查身份验证后)

  • 注意输出缓存,尤其是在您实施自己的会员制

答案 3 :(得分:1)

确保您不要盲目地将表单数据绑定到模型,方法是始终使用TryUpdateModel<T>而不是TryUpdateModel