问题标签 [defensive-programming]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
300 浏览

.net - CLR:如果构造函数失败,它总是会抛出异常吗?

在Delphi中,如果在对象的构造过程中出现异常:任何分配的内存都会被释放并抛出异常。例如,保证以下内容要么返回有效Camera对象,要么抛出异常:

永远不必检查结果变量是否为空:

在 CLR 中也是如此吗?

是否还有其他语法结构可以保证返回值有效或抛出异常?

  • 创建结构(例如矩形)?
  • 获取枚举成员?
  • Object.ToString() 的结果?
  • 数学运算?

在执行数学的情况下:

0 投票
12 回答
8859 浏览

c++ - 0xDEADBEEF 相当于 64 位开发?

对于 32 位系统(无论是 Linux、Mac OS或 Windows,PowerPC还是 x86)的 C++ 开发,我已经初始化了原本未定义的指针(例如,它们不能立即获得正确的值),如下所示:

(为了节省打字和干燥,右手边通常是一个常数,例如 BAD_PTR。)

如果 pInt 在获得正确值之前被取消引用,那么它将在大多数系统上立即崩溃(而不是在某些内存被覆盖或进入非常长的循环时崩溃很久)。

当然,行为取决于底层硬件(从用户进程的奇数地址 0xDEADBEEF 获取 4 字节整数可能是完全有效的),但是对于我迄今为止开发的所有系统,崩溃都是 100% 可靠的( Mac OS 68xxx、Mac OS PowerPC、Linux Redhat Pentium、Windows GUI Pentium、Windows 控制台 Pentium)。例如,在 PowerPC 上,从奇数地址获取 4 字节整数是非法的(总线故障)。

在 64 位系统上这有什么好的价值?

0 投票
3 回答
554 浏览

c# - 针对恶意攻击的防御性编程

我工作的公司正在重新开发一种供外部使用的内部产品。

该产品最初将使用 WPF 在 C# 中开发,然后移植到 Silverlight。

重点之一是针对恶意攻击进行编码,例如 SQL 注入等。

问题:

  1. 任何人都可以推荐指向有关安全“最佳实践”的文章的 URL。
  2. 任何人都可以推荐一种分析工具来分析代码以识别弱点。如果可能,我们希望将该工具包含在我们的持续集成脚本中。
0 投票
10 回答
5736 浏览

java - 防御性编程:Java 指南

我来自 .NET 背景,现在涉足 Java。

目前,我在设计一个针对错误输入的防御性 API 时遇到了很大的问题。假设我有以下代码(足够接近):

但是,此代码可能会因两个原因而失败:

  1. 用户传递一个null节点。
  2. 用户传递了一个无效节点,即图中未包含的节点。

在 .NET 中,我会分别抛出一个ArgumentNullException(而不是一个NullReferenceException!)或一个ArgumentException,将有问题的参数 ( node) 的名称作为参数传递string

Java 似乎没有等效的异常。我意识到我可以更具体,只抛出最接近描述情况的任何异常,甚至为特定情况编写我自己的异常类。

这是最佳做法吗?ArgumentException或者是否有类似于.NET 中的通用类?

在这种情况下进行检查是否有意义null?无论如何,代码都会失败,异常的堆栈跟踪将包含上述方法调用。检查null似乎是多余和过度的。当然,堆栈跟踪会稍微干净一些(因为它的目标是上述方法,而不是HashMapJRE 实现中的内部检查)。但这必须抵消额外if语句的成本,此外,无论如何都不应该发生- 毕竟,传递null给上述方法不是预期的情况,这是一个相当愚蠢的错误。期待它是彻头彻尾的偏执 - 即使我不检查它也会失败并出现同样的异常。

[正如评论中指出的那样,HashMap.put实际上允许null键的值。所以在null这里检查不一定是多余的。]

0 投票
14 回答
36205 浏览

c++ - Techniques for obscuring sensitive strings in C++

I need to store sensitive information (a symmetric encryption key that I want to keep private) in my C++ application. The simple approach is to do this:

However, running the application through the strings process (or any other that extracts strings from a binary app) will reveal the above string.

What techniques should be used to obscure such sensitive data?

Edit:

OK, so pretty much all of you have said "your executable can be reverse engineered" - of course! This is a pet peeve of mine, so I'm going to rant a bit here:

Why is it that 99% (OK, so perhaps I exaggerate a little) of all security-related questions on this site are answered with a torrent of "there is no possible way to create a perfectly secure program" - that is not a helpful answer! Security is a sliding scale between perfect usability and no security at one end, and perfect security but no usability at the other.

The point is that you pick your position on that sliding scale depending on what you're trying to do and the environment in which your software will run. I'm not writing an app for a military installation, I'm writing an app for a home PC. I need to encrypt data across an untrusted network with a pre-known encryption key. In these cases, "security through obscurity" is probably good enough! Sure, someone with enough time, energy and skill could reverse-engineer the binary and find the password, but guess what? I don't care:

The time it takes me to implement a top-notch secure system is more expensive than the loss of sales due to the cracked versions (not that I'm actually selling this, but you get my point). This blue-sky "lets do it the absolute best way possible" trend in programming amongst new programmers is foolish to say the least.

Thank you for taking the time to answer this question - they were most helpful. Unfortunately I can only accept one answer, but I've up-voted all the useful answers.

0 投票
1 回答
1102 浏览

linq - IOrderedEnumerable 和防御性编程

我喜欢防御性编程。我讨厌抛出异常,但这不是我的问题。

我对 linQ 进行了扩展,以便能够使用列名执行订单

对于防御性编程,如果列名无效,此方法将返回给定的枚举。

现在我需要使用 ThenBy进行二次排序。所以我需要那个签名:

我需要返回一个 IOrderedEnumerable。我的问题是保持我的防御性编程功能:我必须返回给定的集合是无效的列名。

有没有一种干净的方法来做到这一点?我所想的只是一些技巧:

  • 使用反射按第一个找到的属性排序,这是有风险的,因为该属性可能不允许排序
  • 实现我自己的 IOrderedEnumerable,这也是有风险的,因为我在 IQueryable 或 IList 上执行排序,然后我执行其他 LinQ 操作,所以我担心副作用。

和建议/建议?谢谢

0 投票
3 回答
171 浏览

asp.net-mvc - 面向 Internet 站点的 ASP.MVC 防御技术

我正在开发我的第一个 asp MVC 项目,该项目最终将在一个可公开访问的 Web 服务器上结束(我曾在 MVC 中开发过一些内部应用程序)。我应该考虑哪些技术、实践(特定于 MVC 或其他)来提高安全性。

显然,在我的脑海中还有用于操作的 AcceptVerb 属性和 Validation 还有什么?

0 投票
14 回答
1677 浏览

c++ - 你应该如何防守?

可能的重复:
防御性编程

今天早上我们就防御性编程的主题进行了一场精彩的讨论。我们进行了代码审查,其中传入了一个指针,但没有检查它是否有效。

有些人认为只需要检查空指针。我质疑它是否可以在更高级别进行检查,而不是通过它通过的每个方法,并且如果另一端的对象不满足某些要求,检查 null 是一个非常有限的检查。

我理解并同意检查 null 总比没有好,但在我看来,只检查 null 会提供一种错误的安全感,因为它的范围有限。如果要确保指针可用,请检查多于 null。

你在这个问题上有什么经验?对于传递给从属方法的参数,您如何在代码中编写防御措施?

0 投票
4 回答
5520 浏览

defensive-programming - 基本的防御性编程

可能重复:
最喜欢的(聪明的)防御性编程最佳实践

一些程序员总是建议我集中精力进行简单的调试。什么是防御性编程,在练习时应该考虑到什么程度?

还有一个更重要的问题:编码时是否需要考虑任何关键事项?它们是什么?

0 投票
4 回答
255 浏览

code-generation - 健壮的代码框架?

我讨厌编写使我的软件更可靠的代码。这是框架应该做的事情!那么,是否有人知道可以巩固代码的代码“增强”实用程序?

如果我必须自己创建类似的东西,它将按如下方式工作:当您使用 Debug 标志编译代码时,它会自动为每个方法添加“固化”代码:

使用 try-catch 扭曲代码并将 Debug.Assert(true) 放入 catch 中(以便在其起源处捕获异常)。

记录每个方法的条目,打印参数的“ToString()”值,这样我就可以追踪发生了什么。

检查每个参数是否为空。

使用“IsValid”框架检查对象本身和每个参数,其中 IsValid() 是对象声明其期望为真的方式(例如,如果我是 TableOfContentsEntry,我希望始终在 IsValid 的书中() 并指向 IsValid() 的页面。

那么,为什么不呢?