65.9K
CodeProject 正在变化。 阅读更多。
Home

如何确保您的应用程序安全

starIconstarIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIcon

2.73/5 (23投票s)

2005年1月27日

6分钟阅读

viewsIcon

49477

如果您从事企业解决方案的开发或质量保证工作,您一定知道应用程序的安全性方面。本文提供了一份相关清单...

引言

您是否开发以网络为中心的应用程序?您是否正在开发企业软件解决方案?您的应用程序是多层架构吗?您的软件组件是否在不同的机器之间协作?您是否担心您的应用程序不安全?您是否想知道客户聘请的外部审计师如何认证您的应用程序是安全的?您是否从事质量保证工作,需要确保您正在测试的应用程序是安全的?

那么,本文将回答这些问题。我力求简洁,以便您快速阅读后就能了解关于此主题最重要的概念。

第一部分 - 确保您的应用程序安全

防范恶意输入

SQL 注入:如果代码中的查询直接针对用户输入执行,用户可能会提供恶意输入,从而对数据库造成严重破坏。例如,用户在供应商名称 UI 字段中输入“A ; DELETE * FROM VENDORS”。您的代码将执行类似“SELECT * FROM VENDORS WHERE VENDORNAME = A ; DELETE * FROM VENDORS”的语句。解决方案是使用经过验证的数据和/或使用参数化查询。

  • URL 篡改:通过 URL 传递用户 ID 等信息可能会让您的生活更轻松。但是,请记住,如果用户输入管理员 ID 而不是自己的 ID 并继续使用系统,将会产生什么后果。
  • 易出错的输入:始终验证用户输入,以确保其在边界条件内,并且不包含任何您无法处理的特殊字符。
  • 恶意脚本:如果您的系统涉及用户上传 HTML,请确保其中不包含任何脚本。最好的方法是从此类输入中剥离任何 SCRIPT 块。
  • 重复请求:限制服务器从单个客户端接受请求的速度和数量。这可以防范 DOS(拒绝服务)攻击,即特定客户端重复请求您的服务器,直到服务器资源耗尽并最终崩溃。

安全访问应用程序

您的应用程序的每个模块或页面都应经过身份验证才能访问。例如:用户不应能够直接指定 URL 并访问页面。您可以选择各种身份验证机制,如 Windows 身份验证、活动目录、数字证书,或者自行实现自定义身份验证逻辑。

加密敏感配置数据

大多数人使用 XML 文件、注册表项或纯文本文件来存储配置相关信息。然而,应该记住,配置数据很容易被窥探。如果您在这些文件或注册表中存储数据库用户名密码或任何此类敏感数据,请务必对其进行加密。

持久存储的安全性

您的应用程序可能生成的中间(缓存)和最终数据存储文件必须存储在具有适当访问权限的文件夹中。例如:您可以将文件夹设置为仅对管理员可见,并使用管理员帐户运行您的应用程序,这样它就可以访问该文件夹,但除了管理员之外,任何人都无法接触它。

传输中的数据

对于基于 Web 的系统,HTTPS 可以确保传输到客户端浏览器的数据是加密的,这样就不会有人嗅探您的数据包并获取数据。所有基于 Web 的系统都使用 URL 来传递应用程序标志、ID,有时还会传递像用户名这样的小尺寸数据。避免在 URL 中使用任何此类人类可读数据。加密 URL,这样用户就不能仅仅通过更改 URL 中的参数来获取其他人的数据。

强制执行强密码策略

如果您的应用程序强制执行以下密码策略,那么精明的用户就有可能查看他老板的私人数据

  • 强密码:至少 6 个字符长且包含字母数字。
  • 将密码尝试失败次数限制在 3 到 5 次。
  • 密码过期:确保用户定期更改密码。
  • 不要给黑客线索:对于身份验证失败,请给出错误消息,如“无效凭据”。不要暗示是用户名还是密码错误。

将用户会话映射到 IIS 用户会话

用户注销后,您的应用程序会话过期后,请务必也清理 IIS 会话,反之亦然。

将处理限制在实际范围内,例如大型搜索

如果您的应用程序具有搜索等机制,其中结果数量可能非常大,那么最好通过某种上限来保护您的服务器。例如,您可以限制搜索一次只返回结果集中的 100 个项目。这将避免您的服务器因单个用户而陷入困境。

审计和日志

嗯,这很明显,但往往没有仔细完成。务必审计所有与安全相关的操作,并为管理员提供基本的报告以进行监控。这将有助于及早发现恶意行为。还要记录有关崩溃/异常的信息以及相应的用户输入。在出现恶意条目时,这将有助于更快地解决问题。

警惕缓冲区溢出

如果您不在 .NET 或 Java 等受管理环境中工作,您可能会遇到缓冲区溢出。当您写入超出数组边界或写入非法内存位置时,就会发生这种情况。这可能会导致进程内存中的数据损坏,从而导致崩溃或安全漏洞。

第二部分 - 确保您的主机安全

  • 确保您的主机上只启动所需的服​​务。以特定的访问权限运行程序和服务。
  • 保护共享文件夹:确保您的共享文件夹只允许特定用户访问。
  • 补丁和更新:经常进行补丁和更新,以使您的操作系统和操作系统服务免受漏洞的侵害。
  • 不鼓励使用默认凭据:强制您的客户端禁用或密码保护默认帐户。例如 SQL Server sa 用户。要求客户使用自定义配置的授权。
  • 停止不使用的服务。禁用操作系统中的所有未使用服务,如索引、Telnet、SMTP、FTP(IIS 特定)等。
  • 保护虚拟目录。对虚拟目录设置最严格的权限。例如,如果虚拟目录仅存储 htm 页面,则将其限制为仅读取访问权限。组织文件夹结构,使具有相似访问级别的项目组合在一起。从顶层文件夹的只读访问开始,仅在必要时才授予特定的写入/执行权限。
  • 请理解网页脚本将在 IUSR_MACHINENAME 用户的访问权限下执行,因此只授予他必要的文件夹上的必要权限。

第三部分 - 确保您的网络安全

禁止所有无效连接,只允许有效连接

使用防火墙配置,只允许合法 IP 地址连接到您的 Web 服务器/应用程序服务器。只开放有效端口,禁用所有其他端口。

防火墙安全和 DMZ 配置

使用防火墙关闭所有入站和出站未使用的端口。如果您必须暴露 Web 服务器,请使用 DMZ 配置,例如只允许 HTTP/FTP 访问 Web 服务器,并且从 Web 服务器机器只允许您的应用程序端口访问网络内部。

结论

如果您遵循这些准则并遵循良好的编码实践,保护您的应用程序就相当简单了。根据您的应用程序类型(例如实用程序与银行),您可以微调需要完成的所有工作。

如果您觉得本文有用,您也会发现这篇出色的文章很有帮助:提高 Web 应用程序安全性:威胁和对策

© . All rights reserved.