用程序安全操作概述

发布日期:2022-01-14 23:04   来源:未知   阅读:

  www.bs1r7.com.cn使用[NuGet](可以使各个框架保持最新。当Visual Studio提示您进行更新时,请将其构建到您的生命周期中。

  请记住,第三方库必须单独更新,并且并非所有人都使用NuGet。例如,ELMAH需要单独的更新工作。

  .NET Framework是一组API,它们支持高级类型的系统,数据,图形,网络,文件处理以及在Microsoft生态系统中编写企业应用程序所需的大多数其余内容。它是一个几乎无处不在的库,在程序集级别上被强命名和版本化。

  •使用参数化的SQL [5]命令进行所有数据访问,无一例外。•不要将SqlCommand [6]与由串联的SQL String [7]组成的字符串参数一起使用。•来自用户的白名单允许值。使用枚举,TryParse或查找值来确保来自用户的数据符合预期。•枚举仍然容易受到意外值的影响,因为.NET仅验证是否成功转换为基础数据类型,默认情况下为整数。Enum.IsDefined [8]可以在定义的常量列表中验证输入值是否有效。•在您选择的数据库中设置数据库用户时,请应用最小特权原则。数据库用户应该只能访问对用例有意义的项目。•在使用实体框架 [9]是一种非常有效的SQL注入 [10]防范机制。请记住,在Entity Framework中建立自己的关联查询与普通SQL查询一样容易受到SQL的影响。•使用SQL Server时,首选集成身份验证而 [11]不是SQL身份验证 [12]。•对敏感数据(SQL Server 2016和SQL Azure)尽可能使用“始终加密” [13],

  ASP.NET Web窗体是用于.NET框架的基于浏览器的原始应用程序开发API,并且仍然是用于Web应用程序开发的最常见的企业平台。

  如果您不使用Viewstate,请使用双重提交cookie查找ASP.NET Web窗体默认模板的默认母版,以获取手动反CSRF令牌。

  •不要在或页面设置中禁用validateRequest [28]web.config 。此值在ASP.NET中启用了有限的XSS保护,应保留完整的位置,因为它提供了跨站点脚本的部分防护。除了内置保护之外,建议进行完整的请求验证。•.NET Framework的4.5版本包括AntiXssEncoder [29]库,该库具有用于防止XSS的全面输入编码库。用它。•随时接受用户输入,将允许值列入白名单。•使用Uri.IsWellFormedUriString [30]验证URI格式。

  •尽可能使用cookie来保持持久性。 Cookieless auth将默认为UseDeviceProfile [31]。•不要信任会话或授权的持久性请求的URI。它很容易伪造。•将表单身份验证超时从默认的20分钟减少到适合您的应用程序的最短时间。如果使用了slideExpiration, [32]则此超时将在每次请求后重置,因此活动用户不会受到影响。•如果不使用HTTPS,则 [33]应该禁用slideExpiration [34]。考虑使用HTTPS禁用slideExpiration [35]。•始终实施适当的访问控制。•将用户提供的用户名与进行比较。•检查角色 User.Identity.IsInRole 。•使用ASP.NET成员资格提供程序和角色提供程序 [36],但查看密码存储。默认存储使用SHA-1的单次迭代对密码进行哈希处理,这很弱。ASP.NET MVC4模板使用ASP.NET身份 [37]而不是ASP.NET成员身份,并且ASP.NET身份默认使用PBKDF2,这更好。查看OWASP密码存储备忘单 [38]以获取更多信息。•明确授权资源请求。•利用基于角色的授权 User.Identity.IsInRole 。

  ASP.NET MVC(模型–视图–控制器)是一种当代的Web应用程序框架,与Web Forms回发模型相比,它使用更加标准化的HTTP通信。

  OWASP 2017年十大最重要的威胁列出了当今世界上最普遍和最危险的网络安全威胁,并且每三年进行一次审查。

  本部分基于此。保护Web应用程序安全的方法应该是从下面的最高威胁A1开始并逐步解决,这将确保花在安全性上的任何时间都可以最有效地花费,并且首先覆盖最重要的威胁,然后覆盖较小的威胁。在进入前十名之后,通常建议评估其他威胁或获得专业完成的渗透测试。

  应做:使用对象关系映射器(ORM)或存储过程是解决SQL Injection漏洞的最有效方法。

  要做的事情:使用必须直接使用SQL查询的参数化查询。在这里 [39]可以找到更多信息。

  请勿:在代码中的任何位置连接字符串,并在数据库中执行它们(称为动态sql)。

  注意:您仍然可能会意外地使用ORM或存储过程执行此操作,因此请检查所有位置。

  要做:练习最小权限-使用具有执行该工作所需的最小权限集的帐户(即不是sa帐户)连接到数据库

  应做:在所有用户提供的输入上使用白名单验证。输入验证可防止格式不正确的数据进入信息系统。有关更多信息,请参见输入验证备忘单 [42]。

  专有名称中几乎可以使用任何字符。但是,某些 \ 字符必须使用反斜杠转义符进行转义。可以在LDAP注入预防速查表上 [44]找到一张表格,其中显示了应为Active Directory逃脱的字符。

  注意:仅当空格字符是组件名称(例如通用名称)中的前导或尾随字符时,才必须转义。嵌入式空间不应逃脱。

  要做:使用ASP.net Core Identity [46]。默认情况下,ASP.net Core Identity框架配置正确,在该框架中,它使用安全的密码哈希和单独的符号。身份使用PBKDF2哈希函数输入密码,并且每位用户都会生成随机的盐。

  请执行以下操作:使用强哈希值存储密码凭据。对于哈希,请参阅本节 [48]。

  应做:以最小的复杂度来强制密码,使其在字典攻击中幸免,即较长的密码使用完整的字符集(数字,符号和字母)来增加熵。

  要做的事情:使用强大的加密例程(例如AES-512),其中需要将个人身份数据恢复为原始格式。保护加密密钥要比保护其他任何资产都重要,请查找更多有关静止存储加密密钥的信息 [49]。应用以下测试:您是否愿意将数据保留在总线上的电子表格中,以供所有人阅读。假设攻击者可以直接访问您的数据库并进行相应的保护。在这里 [50]可以找到更多信息。

  有关传输层保护的更多信息,请参见此处 [59]。例如Web.config

  当XML解析未正确处理在XML有效负载的doctype中包含外部实体声明的用户输入时,就会发生XXE攻击。

  确保在生产环境中通过HTTPS发送cookie。这应该在配置转换中强制执行:

  通过限制请求来保护登录,注册和密码重置方法免受暴力攻击(请参见下面的代码),也可以考虑使用ReCaptcha。

  不要:进行自己的身份验证或会话管理,请使用.Net提供的身份验证或会话管理

  请勿:告诉某人该帐户是否存在登录,注册或密码重置的信息。说类似“用户名或密码不正确”或“如果此帐户存在,则重置令牌将发送到注册的电子邮件地址”之类的内容。这样可以防止帐户枚举。

  无论在内容和行为上,无论是否存在该帐户,对用户的反馈都应该相同:例如,如果在真实帐户中的响应时间延长了50%,则可以猜测和测试成员资格信息。

  应做:授权所有面向外部端点的用户。.NET框架有很多方法可以授权用户,可以在方法级别使用它们:

  你可以找到更多的信息,这里 [64]的访问控制,并在这里 [65]进行授权。

  当您拥有可由引用访问的资源(对象)(在下面的示例中是 id )时,您需要确保打算将用户放在那里

  确保调试和跟踪已在生产环境中关闭。可以使用web.config转换来强制执行:

  如果您使用tag-helpers [70],这是大多数Web项目模板的默认设置,则所有表单都会自动发送防伪令牌。您可以通过检查主 _ViewImports.cshtml 文件是否包含以下内容来检查是否启用了标记辅助功能:

  如果需要禁用控制器上特定方法的属性验证,可以将IgnoreAntiforgeryToken [73]属性添加到控制器方法(对于MVC控制器)或父类(对于Razor页面):

  如果您不能使用全局操作过滤器,请将AutoValidateAntiforgeryToken [75]属性添加到控制器类或剃刀页面模型中:

  如果您在ASP.NET Core MVC视图中使用jQuery,则可以使用以下代码段实现:

  如果您使用的是.NET Framework,则可以在此处 [76]找到一些代码段。

  您可以使用MVC3对所有HTML内容进行编码,无论HTML,java,CSS,LDAP等是否使用Microsoft AntiXSS库都可以对所有内容进行正确编码:

  请勿:使用 [AllowHTML] 属性或帮助程序类, @Html.Raw 除非您真的知道要写入浏览器的内容是安全的并且已被正确转义。

  请执行以下操作:启用内容安全策略 [78],这将阻止您的页面访问其不应该访问的资产(例如恶意脚本):

  要做:验证用户输入恶意用户能够使用Cookie之类的对象插入恶意信息来更改用户角色。在某些情况下,黑客可以使用上一个会话中预先存在或缓存的密码哈希将其特权提升为管理员权限。

  请执行:以有限的访问权限运行反序列化代码如果反序列化的敌对对象试图启动系统进程或访问服务器或主机OS中的资源,则将拒绝访问该对象,并且将引发权限标志,以便系统管理员被告知服务器上的任何异常活动。

  要做:使您的NuGet [82]软件包保持最新,广东大道检测博士研究生导师现场,许多将包含其自身的漏洞。

  要做:作为构建过程的一部分,对您的应用程序运行OWASP Dependency Checker, [83]并对任何高级漏洞进行处理。

  如何记录来自的所有错误 Startup.cs ,以便在引发错误时都会记录该错误。

  例如,注入到类构造函数中,这使得编写单元测试更加简单。建议使用依赖注入(例如MVC控制器)创建类的实例。以下示例显示了所有未成功登录尝试的日志记录。

  •为防止Clickjacking和中间人攻击而捕获初始的非TLS请求,请设置 X-Frame-Options 和 Strict-Transport-Security (HSTS)标头。完整细节在这里 [88]•防止从未来过您网站的用户遭受中间人攻击。注册以获取HSTS预载 [89]•维护Web API服务的安全测试和分析。它们隐藏在MEV站点内部,并且是攻击者将发现的站点的公共部分。所有MVC指南和许多WCF指南都适用于Web API。•未经验证的重定向和转发备忘单 [90]。

  有关上述所有内容的更多信息,以及合并到具有增强的安全性基准的示例MVC5应用程序中的代码示例,请转到Security Essentials Baseline项目。 [91]

  •在您的应用程序的Internet区域安全性约束内工作。•使用ClickOnce部署。要增强权限,请在运行时使用权限提升或在安装时使用可信应用程序部署。

  •尽可能使用部分信任。部分受信任的Windows应用程序可减少应用程序的攻击面。管理您的应用必须使用的权限列表以及可能使用的权限列表,然后在运行时声明性地请求这些权限。•使用ClickOnce部署。要增强权限,请在运行时使用权限提升或在安装时使用可信应用程序部署。