1

例如在运行期间删除输出文件,将 sw 的两个实例定向到同一个 IO 等?

4

7 回答 7

7

您无法阻止用户这样做,但您可以做的是应用防御性编程

在您的两个示例中,您必须在每次访问资源时检测故障情况并做出适当的反应,要么抛出异常并死去,要么在无法访问该资源的情况下继续。

永远不要假设资源分配会成功,始终检查您无法控制的内容。简而言之,尽可能少地假设并验证一切

'我被告知访问此文件以写入它。它已经开放了吗?我有权限吗?它有预期的格式吗?磁盘是否有足够的空间?ETC。'

关于这一点还有很多。只是谷歌防御性编程,你会读到很多东西。

于 2008-10-29T12:07:29.747 回答
1

假设什么。每次都检查每个使用 IO 的操作。在您的软件中添加一个额外的层,用于内置检查的 IO。

于 2008-10-29T12:10:54.653 回答
1

在 UI 上的每个文本框或编辑控件上设置最大输入长度。测试输入无效数据(例如,编辑中需要数字的文本),并采用一种通用的方法来检查/处理这种输入。

还要考虑通过搜索词进行的 SQL 注入攻击。例如查找姓氏为___的人,用户输入“*smith”;select * from users*"。数据库层将如何处理它?

如果用户输入的数据将显示给他们(或者更糟糕的是,显示给其他用户),请查看他们是否可以将任何标记或控制序列嵌入其中,从而在显示时滥用 UI。

您没有说明您的目标是什么操作系统和语言,而是着眼于为应用程序提供执行所需的最低权限。例如在.Net 中,查看声明性安全属性。这意味着,如果攻击者控制了您的应用程序,他们可以对它造成的损害就会减少。

创建带有故意错误输入的单元测试,以验证应用程序是否可以处理它。

于 2008-10-29T12:20:12.000 回答
1

这里有一些很好的答案,但我认为你需要考虑你要防御什么。

该程序是否会被想要使用它的人使用?如果是这样,您需要防御愚蠢(在实际范围内)而不是破坏。您仍然想检查所有输入,但如果用户确实做了一些愚蠢的事情,那么得到不太理想的结果是合理的。如果用户有权访问系统,您可能无法阻止删除输出文件等操作,因此您无法为其编写代码。有些事情只是培训问题。

该程序是否会被不想要的人使用,例如用于记录人们何时进出的时钟应用程序?有人需要考虑物理安全(商业版本被设计成会被大量滥用)和软件安全(所以没有人可以改变时代)。您需要提供一个非常简单的界面并详细检查输入。

于 2008-10-29T13:46:28.423 回答
0

如果有优秀的测试人员来模拟用户滥用呢?

于 2008-10-29T15:21:25.173 回答
0

这是一个棘手的问题。用户(甚至是愚蠢的用户)可以巧妙地以您从未考虑过的方式使用您的应用程序。

我是防御性编程的忠实粉丝(正如 Vinko 上面提到的)。您可以从危害分析的角度来处理它。查看您的应用程序使用和修改的资源(文件、设备、数据等),并集思广益这些资源可能出现的问题并围绕它进行计划。

例如,如果您有一个专用的硬件资源,并且应用程序的多个实例将各自争夺该资源,您可以为您的应用程序强制使用单例模式,以便用户无法运行多个实例。

所有这一切都需要一些计划和工作,但是,嘿,这就是我们得到报酬的原因:)

于 2008-10-29T15:27:14.570 回答
0

我听说有人在做的一件事是在VirtualPC下运行不受信任的东西,这样基础系统无论如何都不会受到损坏。

于 2008-10-29T13:30:02.623 回答