Zoran Horvat建议使用Either类型来避免空检查,并且在操作执行过程中不要忘记处理问题。Either在函数式编程中很常见。
为了说明它的用法,卓然展示了一个类似的例子:
void Main()
{
var result = Operation();
var str = result
.MapLeft(failure => $"An error has ocurred {failure}")
.Reduce(resource => resource.Data);
Console.WriteLine(str);
}
Either<Failed, Resource> Operation()
{
return new Right<Failed, Resource>(new Resource("Success"));
}
class Failed { }
class NotFound : Failed { }
class Resource
{
public string Data { get; }
public Resource(string data)
{
this.Data = data;
}
}
public abstract class Either<TLeft, TRight>
{
public abstract Either<TNewLeft, …Run Code Online (Sandbox Code Playgroud) 这个例子在使用模式匹配时被讨论为可能的“陷阱”:
NOT_FOUND = 400
retcode = 200
match retcode:
case NOT_FOUND:
print('not found')
print(f'Current value of {NOT_FOUND=}')
Run Code Online (Sandbox Code Playgroud)
这是使用结构模式匹配意外捕获的示例。它给出了这个意想不到的输出:
not found
Current value of NOT_FOUND=200
Run Code Online (Sandbox Code Playgroud)
同样的问题以其他形式出现:
match x:
case int():
pass
case float() | Decimal():
x = round(x)
case str:
x = int(x)
Run Code Online (Sandbox Code Playgroud)
在这个例子中,str需要有括号,str(). 没有它们,它“捕获”并且str内置类型被替换为x的值。
是否有防御性编程实践可以帮助避免这些问题并提供早期检测?
python defensive-programming python-3.10 structural-pattern-matching
对XSS,Sql注入,拒绝服务等常见Web攻击有什么必要的防御方法?
编辑:我根据维基百科的描述收集了您的回复.我添加了一些额外的问题以获得完整的参考.
Sql注入
SQL注入是一种代码注入技术,它利用应用程序数据库层中发生的安全漏洞.当用户输入被错误地过滤为嵌入在SQL语句中的字符串文字转义字符或用户输入没有强类型并因此意外执行时,存在漏洞.它是一种更普遍的漏洞类型的实例,只要一种编程或脚本语言嵌入另一种内部,就会发生这种漏洞.
跨站点脚本(XSS)
跨站点脚本是一种通常在Web应用程序中发现的计算机安全漏洞,它允许恶意Web用户将代码注入其他用户查看的Web页面.此类代码的示例包括HTML代码和客户端脚本.攻击者可以使用利用漏洞利用的跨站点脚本漏洞来绕过访问控制,例如相同的源策略.
拒绝服务攻击
拒绝服务攻击(DoS攻击)或分布式拒绝服务攻击(DDoS攻击)是企图使其预期用户无法使用计算机资源.虽然DoS攻击的执行手段,动机和目标可能有所不同,但它通常包括一个或多个人的协同恶意努力,以防止Internet站点或服务有效或根本无法正常或无限期地运行.
我知道似乎不可能以编程方式避免拒绝服务攻击,但你怎么想?
蛮力攻击
在密码分析中,暴力攻击是一种通过系统地尝试大量可能性来破坏加密方案的方法; 例如,密钥空间中的大量可能密钥以便解密消息.在大多数方案中,人们认识到蛮力攻击的理论可能性,但它的建立方式使得执行它在计算上是不可行的.
一些额外的问题:
您如何看待尝试根据您的内容发布输入的网络机器人?例如,SO正在使用图像验证.
你对javascript eval函数有什么看法?
有没有办法访问服务器上没有暴露给外部的内容.例如,我有一个页面,将一些重要的记录插入到我的数据库中,只有我知道它的URL.有没有办法获得这种文件?我知道你可以为它设置一些安全规则.
(注意:目录列表已禁用,我托管此文件.)
谢谢你的回复!
免责声明:我是一名正在学习编程的非专业人士.从未参与过项目,也没有写过超过500行的文章.
我的问题是:防御性编程是否违反了"不要重复自己"的原则?假设我对防御性编程的定义是正确的(让调用函数验证输入而不是相反),这对你的代码不会有害吗?
例如,这很糟糕:
int foo(int bar)
{
if (bar != /*condition*/)
{
//code, assert, return, etc.
}
}
int main()
{
int input = 10;
foo(input); //doesn't the extra logic
foo(input); //and potentially extra calls
foo(input); //work against you?
}
Run Code Online (Sandbox Code Playgroud)
与此相比:
int main()
{
if (input == /*condition*/)
{
foo(input);
foo(input);
foo(input);
}
}
Run Code Online (Sandbox Code Playgroud)
再说一次,作为一个外行人,我不知道有多少简单的逻辑陈述对你来说就性能而言是多少,但对于程序或灵魂而言,防御性编程肯定不好.
可能重复:
防御性编程
今天早上我们就防御性节目的主题进行了很好的讨论.我们进行了代码审查,其中传入指针并且未检查它是否有效.
有些人认为只需要检查空指针.我质疑它是否可以在更高级别进行检查,而不是通过它传递的每个方法,并且如果该点另一端的对象不满足某些要求,则检查null是非常有限的检查.
我理解并同意检查null总比没有好,但我觉得只检查null会提供错误的安全感,因为它的范围有限.如果要确保指针可用,请检查多于null.
你对这个问题有什么经验?如何在代码中为传递给从属方法的参数编写防御措施?
我已经读过关于像Erlang这样的语言编程失败的程序如何最终使用比大多数其他语言中的防御风格更短的程序.这对所有类型的程序都是正确的,这是什么原因?
到目前为止,我对整体安全性考虑并不关心,因为我一直在开发促销和不加批判的iPhone应用程序.
但是,目前我正在研究Mac应用程序,因为它涉及敏感的用户信息,因此需要更多关于此事的更多信息.
虽然我知道我必须注意以物理形式(在磁盘上)保护数据,例如通过加密它,我想知道在正常使用应用程序的过程中它驻留在内存中是多么安全.
因此,我想知道:
只要它仅构建在NSTextField和Core Data等框架元素上,我的应用程序的安全性如何?
Cocoa输入元素对恶意攻击有多敏感?保护使用Core Data存储的已保存数据的最佳方法是什么?
有许多类型的外部依赖项.与外部应用程序,组件或服务连接(例如,Outlook用于发送电子邮件,TWAIN或WIA用于扫描,ActiveX对象和Web服务用于各种目的,等等).
您确保应用程序是健壮的,并且即使这些外部依赖项(由于无数原因)不可用时也可以运行的策略是什么?
注意:您自己的源代码中包含的外部源代码是另一种外部依赖项,但这主要不是我在这里所关注的.
language-agnostic defensive-programming robustness external-dependencies
我是一名长期 C/C++ 程序员,正在学习 Java。我读过有关通过使用返回对私有字段的引用的访问器方法来破坏封装的问题。标准的Java解决方案似乎是防御性复制——调用复制构造函数或clone()来创建字段的副本并返回对该副本的引用。我不明白为什么没有人担心制作防御性副本的低效率。在 C++ 中,访问器只会返回一个指向 const 的指针,从而保护私有成员而不进行复制。为什么Java没有const引用?
鲍勃叔叔说:
\n\n“非公开 API 中的防御性编程是不进行 TDD 的团队的一种气味和症状。”
\n\n我想知道 TDD 如何避免以意想不到的方式使用(内部)函数?我认为 TDD 可以\xc2\xb4t 避免它。它仅表明该函数使用正确,因为调用函数被通过单元测试的 it\xc2\xb4s 覆盖。
\n\n当使用(非防御性)功能开发新功能时,该功能也是使用 TDD 开发的。因此,无意使用该功能将导致新功能测试失败。
\n\n因此,使用 TDD 来驱动新功能将迫使您正确使用(内部)功能。
\n\n你认为这就是鲍勃叔叔\xc2\xb4s 推文的含义吗?
\nc++ ×2
security ×2
.net ×1
c# ×1
cocoa ×1
dry ×1
erlang ×1
fail-fast ×1
java ×1
macos ×1
oop ×1
performance ×1
python ×1
python-3.10 ×1
robustness ×1
structural-pattern-matching ×1
tdd ×1