例如在运行期间删除输出文件,将 sw 的两个实例定向到同一个 IO 等?
7 回答
您无法阻止用户这样做,但您可以做的是应用防御性编程。
在您的两个示例中,您必须在每次访问资源时检测故障情况并做出适当的反应,要么抛出异常并死去,要么在无法访问该资源的情况下继续。
永远不要假设资源分配会成功,始终检查您无法控制的内容。简而言之,尽可能少地假设并验证一切。
'我被告知访问此文件以写入它。它已经开放了吗?我有权限吗?它有预期的格式吗?磁盘是否有足够的空间?ETC。'
关于这一点还有很多。只是谷歌防御性编程,你会读到很多东西。
假设什么。每次都检查每个使用 IO 的操作。在您的软件中添加一个额外的层,用于内置检查的 IO。
在 UI 上的每个文本框或编辑控件上设置最大输入长度。测试输入无效数据(例如,编辑中需要数字的文本),并采用一种通用的方法来检查/处理这种输入。
还要考虑通过搜索词进行的 SQL 注入攻击。例如查找姓氏为___的人,用户输入“*smith”;select * from users*"。数据库层将如何处理它?
如果用户输入的数据将显示给他们(或者更糟糕的是,显示给其他用户),请查看他们是否可以将任何标记或控制序列嵌入其中,从而在显示时滥用 UI。
您没有说明您的目标是什么操作系统和语言,而是着眼于为应用程序提供执行所需的最低权限。例如在.Net 中,查看声明性安全属性。这意味着,如果攻击者控制了您的应用程序,他们可以对它造成的损害就会减少。
创建带有故意错误输入的单元测试,以验证应用程序是否可以处理它。
这里有一些很好的答案,但我认为你需要考虑你要防御什么。
该程序是否会被想要使用它的人使用?如果是这样,您需要防御愚蠢(在实际范围内)而不是破坏。您仍然想检查所有输入,但如果用户确实做了一些愚蠢的事情,那么得到不太理想的结果是合理的。如果用户有权访问系统,您可能无法阻止删除输出文件等操作,因此您无法为其编写代码。有些事情只是培训问题。
该程序是否会被不想要的人使用,例如用于记录人们何时进出的时钟应用程序?有人需要考虑物理安全(商业版本被设计成会被大量滥用)和软件安全(所以没有人可以改变时代)。您需要提供一个非常简单的界面并详细检查输入。
如果有优秀的测试人员来模拟用户滥用呢?
这是一个棘手的问题。用户(甚至是愚蠢的用户)可以巧妙地以您从未考虑过的方式使用您的应用程序。
我是防御性编程的忠实粉丝(正如 Vinko 上面提到的)。您可以从危害分析的角度来处理它。查看您的应用程序使用和修改的资源(文件、设备、数据等),并集思广益这些资源可能出现的问题并围绕它进行计划。
例如,如果您有一个专用的硬件资源,并且应用程序的多个实例将各自争夺该资源,您可以为您的应用程序强制使用单例模式,以便用户无法运行多个实例。
所有这一切都需要一些计划和工作,但是,嘿,这就是我们得到报酬的原因:)
我听说有人在做的一件事是在VirtualPC下运行不受信任的东西,这样基础系统无论如何都不会受到损坏。