“if”语句有多安全?

3

无论使用何种编程语言,我总是对通过if语句实现安全性的概念感到困惑。我所编写的所有代码都依赖于这一行代码的成功执行:

user = getUserName();
password = getPassword();

if (match(user, password)) {
    print secret information;
}

因为只有一行代码,我觉得破坏可能相对简单。我是否忽略了什么,或者单个if确实是最好的方法?


5
“Sabotage”?如果攻击者有源代码的写入权限,那么你无论如何都会遭受破坏。此外,还有什么替代方案吗?把整个逻辑变得非常复杂和混淆,以至于攻击者和维护者都无法理解它吗?即使是这样,任何严重的攻击者也将通过任何混淆和复杂的安全方案 - 只要看看盗版音乐、电影、视频游戏等就知道了。 - user395760
2
一个攻击者如何在没有访问权限的情况下攻击你的代码呢? - undefined
1
@Mikhail,我希望我的储蓄账户不仅仅由一行代码保护,而是由一个深刻理解安全并审查了所有相关代码的团队来保护。 - undefined
1
我本人与@svick有着相同的希望,但如果在最后,经过SSL、加密、散列、盐值以及献祭山羊来驱逐邪恶攻击者后,是否允许访问我的银行账户的决定实际上是通过使用一个if语句来实现的,我也不会感到惊讶,并且这些专家们认为整个过程是安全的。我认为if并没有什么特别之处 - 按照定义,你必须通过某种方式进行分支判断,无论是通过if、多态性,甚至是巧妙的间接跳转。关键是决策本身(条件)是否可以被操控。 - user395760
@Rook,听起来你还有更多要说的...发表一个真正的回答吧? - undefined
显示剩余8条评论
7个回答

5
你是对的,像这样的一个if容易被黑客攻击。如果有人反向工程这个应用程序,你可以很容易地修改几个指令来跳过if
有各种各样的选项,比如混淆可执行文件或添加更复杂的检查,并将它们添加到应用程序的各个位置。但无论你做什么,你的应用程序总是可以被黑客攻击。
最好的方法是不要担心它。当你的应用程序变得如此优秀和广泛使用,以至于人们真正愿意花费精力去破解它时,你可能已经赚了足够多的钱来更好地保护它。在那之前,甚至考虑这个问题都是浪费时间。

2
一个相当令人安慰的答案。+1,并且鼓励一下。 - undefined

4
在你展示的具体情况中,如果你真的担心未经授权的人看到“print secret information;”输出的秘密信息,那么你应该使用提供的密码加密“秘密信息”。这将确保只有能够提供正确密码的人才能查看秘密信息。

+1 因为它解决了我对 if 的强大能力的确切关注。 - undefined

2
IF语句中经常被忽视的一个问题是时序攻击。假设您有一个基于直接匹配密码的Web应用程序,该密码与存储在数据库中的密码进行比较(是的,我知道没有理智的人会将密码存储在数据库中,但正如柴郡猫所说,“我们都是疯子”)。然后,比较过程的时间取决于密码是否与第一个字符、第二个字符或最后一个字符不匹配。虽然时间差似乎很小,但攻击者足以尝试猜测密码,即使是通过互联网,更不用说本地分析了。时序攻击比我描述的要复杂一些,但总的来说,IF比较并不是100%安全的,至少不是在所有情况下。

从来没有考虑过这个 :) 我无法想象它在任何地方都不适用,但是这是一个很有用的技巧,可以收入你的口袋中。 - undefined
@Mikhail 我怕这比人们想象的更适用。也就是说,它不仅仅是理论上的。 - undefined
哦,我明白了 :) 我正在想象今天我可以应用它的情况。在我的服务器上,如果用户/密码不匹配,我会延迟4秒发出错误提示。 - undefined
@Mikhail 延迟应该是随机的。固定延迟对于对抗此类攻击没有任何安全性增加。取而代之,您只需获得 X + 4000,而不是时间 X。 - undefined

2
“if”语句是绝对安全的,永远不会成为漏洞的原因。漏洞来自于代码中几乎所有其他部分。
你使用的比较运算符可能存在缺陷。例如,“==”运算符采用模糊匹配,其中接受可能值范围。这可能对安全性不利,但很难举出好的例子,对于密码来说并不重要。一个简单的$password==$_GET['password']应该可以正常工作。
你的“if”语句也可能依赖于错误的正则表达式,例如:
if(preg_match('/(.+)\\.js/'.$_GET['file'])){
    readfile($_GET['file']);
}

在这种情况下,正则表达式正在查找字符串中的任何 .js,而不是强制它在末尾。
?file=../../.js/../../../../../../../etc/passwd

(而这个漏洞让我赢得了 Mozilla 漏洞赏金计划的 3000 美元 ;))

我记得这种类型的黑客攻击。我似乎通过使用哈希或者PHP的realpath来绕过它们。不过还是谢谢。 - undefined

1

在一行代码中使用if并不会导致不安全问题。

如果代码在您的服务器上运行,重要的是服务器的安全性如何。如果黑客获取了访问权限,您的代码有多么复杂都无所谓,他都可以绕过它。

同样,如果您的代码在潜在攻击者的计算机上运行(比如一个您想要保护的电脑游戏),您无法阻止攻击者。您只能使攻击者的工作稍微困难一些,但也仅此而已。

你不应该担心一行代码的安全性,而是要关注整个系统的安全性。如果你让你的代码更加复杂,那么你只是为潜在漏洞引入了更多可能性。使用更加复杂的代码是试图通过混淆来增强安全性,这是不起作用的。

如果您不能信任您的计算机正确地执行简单的if语句,那么您根本就不能信任它。


1
如果这是服务器代码-这不是问题,只要您保持服务器安全即可。
如果这是客户端代码-你是对的。有人可以操纵你的代码-无论是二进制文件还是内存映像(一旦加载)。但是,对于任何客户端应用程序都是如此。您只能使其更难(例如使用PECompact + Anti-debug plugin等工具),但无法实现非常强大的安全性。

没听说过这些工具。谢谢。 - undefined

0

我不确定是否理解你的问题。

软件安全技术并不完美,据我所知,它们假设编译器中存在一些错误,并且需要一个“完美”的硬件(也就是处理器能够正确解释机器码)。

对于不完美的硬件,我不熟悉(但很感兴趣)相关方法(除了使用冗余或其他技术,如ECC,来检测硬件错误)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接