问题标签 [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 投票
7 回答
531 浏览

security - web应用攻击,必须有防御方法

对于XSSSql InjectionDenial of Service等常见的Web 攻击,您必须具备哪些防御方法?

编辑:我根据维基百科的描述收集了您的回复。我添加了一些额外的问题以获得完整的参考。

Sql 注入

SQL 注入是一种代码注入技术,它利用应用程序数据库层中出现的安全漏洞。当用户输入被错误地过滤为嵌入在 SQL 语句中的字符串文字转义字符或用户输入不是强类型并因此意外执行时,就会出现此漏洞。它是一类更普遍的漏洞的一个实例,只要将一种编程或脚本语言嵌入到另一种中,就会发生这种漏洞。

  • 不要相信用户输入并尽早验证它。
  • 不要从原始用户输入构建 SQL,而是使用参数。

跨站脚本 (XSS)

跨站脚本是一种通常在 Web 应用程序中发现的计算机安全漏洞,它允许恶意 Web 用户将代码注入到其他用户查看的网页中。此类代码的示例包括 HTML 代码和客户端脚本。攻击者可以利用被利用的跨站脚本漏洞绕过同源策略等访问控制。

  • 切勿逐字输出或执行用户提交的内容。
  • HTML 编码所有输出。

拒绝服务攻击

拒绝服务攻击(DoS 攻击)或分布式拒绝服务攻击(DDoS 攻击)是试图使其目标用户无法使用计算机资源。尽管 DoS 攻击的实施方式、动机和目标可能会有所不同,但它通常包括一个或多个人为阻止 Internet 站点或服务有效运行或完全暂时或无限期地运行而做出的恶意努力.

我知道以编程方式避免拒绝服务攻击似乎是不可能的,但你怎么看?

蛮力攻击

在密码分析中,蛮力攻击是一种通过系统地尝试大量可能性来击败密码方案的方法。例如,密钥空间中的大量可能密钥用于解密消息。在大多数方案中,暴力攻击的理论可能性是公认的,但它的设置方式使得它在计算上不可行。

  • 每当登录尝试出错时锁定帐户。永远不允许无限制的重试。
  • 当输入的密码错误时添加延迟。

一些额外的问题:

  • 您如何看待尝试根据您的内容发布输入的网络机器人?例如,SO 正在使用图像验证。

  • 您如何看待 javascript eval函数?

  • 有没有办法访问服务器上未暴露于外部的内容。例如,我有一个向我的数据库插入一些重要记录的页面,只有我知道它的 url。有没有办法获得这种文件?我知道你可以设置一些安全规则。

注意:目录列表已禁用,我托管此文件。)

感谢您的回复!

0 投票
3 回答
341 浏览

c# - 如何防止异常值插入数据库?

我有一个 MS SQL DB,其中包含一组表,每个表代表一组根据我们的公式计算的变量。所有变量都是具有预定义精度的数字(我们使用数字数据类型,其中 nm 作为整数部分的 n 位数和小数部分的 m 位数)。

我的问题是如何防止异常值或任何违反列大小的无效值?目前我们正在做简单的“try catch”,因为 ADO.net 会为无效值抛出异常,有没有更好的方法?此外,我想在此列中为此异常值设置一个有效值(即:可能为零)。我正在使用 C#3、MSSQL 2000 并使用SqlBulkCopy类插入。

PS:我在询问来自 DB 端或 dotnet 端的任何解决方案

0 投票
3 回答
547 浏览

c++ - 自定义复制构造函数并添加字段

重复这个

在 C++ 中,您有时必须自己实现复制构造函数(当您通常将指针作为成员时)。编译器生成的复制构造函数的缺点是,当您添加成员字段并忘记在复制构造函数中添加复制行时,您会遇到问题,这通常很难追踪。我喜欢防守性地编程,这让我有点担心。

一种解决方案是使用 memcpy,然后正确处理指针,但据我了解,这是不鼓励的。

0 投票
1 回答
472 浏览

security - 允许用户嵌入视频的主要安全问题

我希望允许用户在开发中自由地在应用程序中嵌入视频,但不想将应用程序暴露给恶意使用。

考虑到这一点,允许用户嵌入来自外部资源(如 YouTube、Vimeo 等)的视频的主要安全问题是什么(XSS 等)。可以通过哪些方式使用这些漏洞?在接受/显示嵌入视频之前,你们建议应用哪种清理方法?

0 投票
8 回答
1372 浏览

c# - 将项目添加到列表/ 防御性编程

在添加到 C# 列表时明确检查/处理您没有达到 2^31 - 1 (?) 的最大条目数是疯狂的,是真是假?

(假设这是一个平均列表大小小于 100 的应用程序。)

0 投票
15 回答
1573 浏览

defensive-programming - 我的代码应该有多“防御”?

我正在和我的一位同事讨论你的代码应该如何防御。我都是专业的防御性编程,但你必须知道在哪里停下来。我们正在开发一个将由其他人维护的项目,但这并不意味着我们必须检查开发人员可以做的所有疯狂的事情。当然,你可以这样做,但这会给你的代码增加很大的开销。

你怎么知道在哪里画线?

0 投票
9 回答
30010 浏览

c++ - 如何隐藏exe或dll中的字符串?

我发现可以从二进制文件中提取硬编码字符串。
例如,Process Explorer的属性视图显示所有超过 3 个字符的字符串。

这是我编写的一个简单可执行文件的代码,用于简单地对其进行测试:

可以清楚地从相应的可执行文件中提取字符串:
替代文字

我认为找到字符串有点太容易了。

我的问题是:

  1. 如何在可执行文件中简单地隐藏hiddenString1hiddenString2
  2. 有没有比使用一些晦涩的隐藏输入更安全的方法来使用“作弊码”?
0 投票
8 回答
5286 浏览

java - clone() 真的用过吗?getter/setter 中的防御性复制怎么样?

人们实际上曾经使用过防御性吸气剂/二传手吗?对我来说,99% 的时间你打算让你在另一个对象中设置的对象成为同一个对象引用的副本,并且你打算对它所做的更改也在它设置的对象中进行。如果你setDate ( Date dt )和以后修改 dt,谁在乎呢?除非我想要一些基本的不可变数据 bean,它只有原语并且可能像 Date 这样简单,否则我从不使用它。

就克隆而言,副本的深度或浅度存在问题,因此知道克隆对象时会出现什么似乎有点“危险”。我想我只使用clone()过一次或两次,那就是复制对象的当前状态,因为另一个线程(即另一个访问 Session 中相同对象的 HTTP 请求)可能正在修改它。

编辑 - 我在下面发表的评论更多的是问题:

但是话又说回来,您确实更改了日期,所以这是您自己的错,因此整个讨论了“防御性”一词。如果所有应用程序代码都在中小型开发人员群体中由您自己控制,那么仅记录您的类就足以替代制作对象副本了吗?或者这不是必需的,因为您应该始终假设在调用 setter/getter 时没有复制某些内容?

0 投票
6 回答
1460 浏览

c++ - 防御性编程是否违反 DRY 原则?

免责声明:我是一个正在学习编程的外行。从来没有参与过一个项目,也没有写过超过 500 行的东西。

我的问题是:防御性编程是否违反了不要重复自己的原则?假设我对防御性编程的定义是正确的(让调用函数验证输入而不是相反),那不会对您的代码有害吗?

例如,这很糟糕吗:

与此相比:

同样,作为外行,我不知道就性能而言,有多少简单的逻辑语句对您不利,但防御性编程肯定对程序或灵魂不利。

0 投票
14 回答
2667 浏览

c# - 我应该如何防守?

我正在使用一个用于创建数据库连接的小例程:

然后我开始查看 .NET 框架文档,查看各种事物的记录行为是什么,并查看我是否可以处理它们。

例如:

文档说,如果无法检索集合,调用ConnectionStrings会引发ConfigurationErrorException 。在这种情况下,我无能为力来处理这个异常,所以我会放手的。


下一部分是ConnectionStrings的实际索引以查找connectionName

在这种情况下,ConnectionStrings 文档说如果找不到连接名称,该属性将返回null 。我可以检查是否发生了这种情况,并抛出一个异常让某人高高在上,他们给出了一个无效的连接名称:


我重复相同的练习:

GetFactory方法没有关于如果ProviderName找不到指定的工厂会发生什么的文档。没有记录返回null,但我仍然可以防御,并检查是否为空:


接下来是 DbConnection 对象的构造:

同样,文档没有说明如果无法创建连接会发生什么,但我可以再次检查是否有空返回对象:


接下来是设置 Connection 对象的属性:

文档没有说明如果无法设置连接字符串会发生什么。它会抛出异常吗?它会忽略它吗?与大多数例外情况一样,如果在尝试设置连接的 ConnectionString 时出现错误,我无法从中恢复。所以我什么都不做。


最后,打开数据库连接:

DbConnection的Open 方法是抽象的,因此由 DbConnection 的任何提供者来决定它们抛出什么异常。抽象的开放方法文档中也没有关于如果出现错误我会发生什么的指导。如果连接出现错误,我知道我无法处理它 - 我必须让它冒泡,调用者可以向用户显示一些 UI,然后让他们再试一次。


概括

所以我的四行函数变成了 12 行,并且需要 5 分钟的文档查找。最后,我确实发现了一种允许方法返回 null 的情况。但实际上我所做的只是将访问冲突异常(如果我尝试在空引用上调用方法)转换为InvalidArgumentException

我还发现了两种可能存在返回对象的情况;但我又一次只用一个例外换了另一个。

从积极的方面来说,它确实发现了两个问题,并解释了异常消息中发生的事情,而不是在路上发生的坏事(即责任止步于此)

但是这值得吗?这是矫枉过正吗?这种防御性编程是否出错了?