“if”语句的安全性如何?

Posted

技术标签:

【中文标题】“if”语句的安全性如何?【英文标题】:How secure is the "if" statement? 【发布时间】:2011-12-17 08:28:24 【问题描述】:

无论使用哪种语言,我总是对if 的安全概念感到困惑。我编写的所有代码都依赖于 if 语句的那一行的成功:

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

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

由于只有一行,我觉得破坏可以相对简单。我是否忽略了一些事情,或者单个 if 真的是最好的方法吗?

【问题讨论】:

“破坏”?如果攻击者拥有对源代码的写入权限,那么无论如何你都会被搞砸³。此外,还有什么替代方案?让整个逻辑如此复杂和模糊,以至于攻击者和维护者都无法理解它?即便如此,任何严重的攻击者通过任何混淆和复杂的安全方​​案进行工作 - 只需看看音乐、电影、视频游戏等的盗版。 不,我问的是来自外部的攻击。 攻击者如何在没有访问权限的情况下攻击您的代码? @Mikhail,我希望我的储蓄账户不受一条线的保护,而是由一组深入了解安全并审查所有相关代码的人保护。 我和@svick 有同样的希望,但如果最后,在 SSL 和加密、散列、加盐和牺牲一只山羊来击退邪恶的攻击者之后,我也不会感到惊讶,是否允许访问我的银行账户的决定是使用if 声明来实现的,这些专家理所当然地认为整个事情是安全的。我不认为if 有什么特别之处 - 你必须 分支以某种方式 定义,无论是通过if、多态性,甚至是聪明的间接跳。这是关于决定本身(条件)是否可以被操纵。 【参考方案1】:

你说得对,像这样的if 很容易被黑。如果对这个应用程序进行逆向工程,您可以轻松修改几条指令以跳过if

有多种选择,例如混淆可执行文件或添加更复杂的检查并将它们添加到应用程序的各个位置。但无论您做什么,您的应用程序都可能被黑客入侵。

最好的办法就是不用担心。等到您的应用程序如此出色、出色并被广泛使用以致人们实际上愿意努力破解它时,您可能会赚到足够的钱来更好地保护它。在那之前,想一想都是浪费时间。

【讨论】:

一个相当令人欣慰的答案。 +1 拍拍后背【参考方案2】:

在您展示的具体情况下,如果您真的担心未经授权的人看到“打印秘密信息”输出的秘密信息;您将使用提供的密码加密“秘密信息”。这将确保只有能够提供正确密码的人才能看到秘密信息。

【讨论】:

+1 因为它解决了我对if 的力量的确切担忧【参考方案3】:

关于 IF 的一件事经常被忽视。这叫做定时攻击。假设您有一个 Web 应用程序,该应用程序基于发送的密码与存储在数据库中的密码的直接匹配进行比较(是的,我知道在他的脑海中没有人会将密码存储在数据库中,但正如柴郡猫所说,“我们都疯了这里”)。然后比较过程需要不同的时间,具体取决于密码是否在第一个字符、第二个字符或最后一个字符上不匹配。虽然看起来时间差很小,但攻击者即使在互联网上尝试猜测密码也足够了,而不是谈论本地分析。定时攻击比我描述的要复杂一些,但总的来说,IF 比较不是 100% 安全的,至少在所有情况下都不是。

【讨论】:

从来没有想过 :) 并不是真的适用于任何我能想象到的地方,但可以放在口袋里的一个不错的技巧 @Mikhail 恐怕它比人们想象的更适用。 IE。这不仅仅是理论上的。 哦,我明白了 :) 我在想象今天可以应用它的案例。在我的服务器上,如果用户/通行证不匹配,我会发出 4 秒延迟 @Mikhail 延迟应该是随机的。持续的延迟不会增加抵御此类攻击的安全性。您只需得到 X + 4000,而不是时间 X。【参考方案4】:

if 语句绝对安全,绝不会成为漏洞的原因。漏洞几乎来自代码中的所有其他内容。

您使用的比较运算符可能存在缺陷。例如,== 运算符采用模糊匹配,其中接受 range of possible values。这可能不利于安全,但很难想出一个很好的例子,密码并不重要。一个简单的$password==$_GET['password'] 应该可以正常工作。

您的 if 语句也可能依赖于错误的正则表达式,例如

if(preg_match('/(.+)\\.js/'.$_GET['file']))
    readfile($_GET['file']);

在这种情况下,正则表达式会在字符串中的任何位置查找 .js,而不是强制将其放在末尾。

?file=../../.js/../../../../../../../etc/passwd

(这个漏洞在 Mozilla 漏洞赏金计划中为我赢得了 3,000 美元;)

【讨论】:

我记得这种黑客行为。我似乎通过使用哈希或 php 的realpath 绕过它们。不过还是谢谢【参考方案5】:

如果这是服务器代码 - 这不是问题,只要您确保服务器安全。

如果这是一个客户端代码 - 你是对的。有人可以操纵您的代码 - 二进制文件或内存映像(一旦加载)。但是,对于任何客户端应用程序都是如此。你只能让它变得更难(例如使用PECompact + Anti-debug plugin 之类的工具),但你无法实现非常强大的安全性。

【讨论】:

没听说过这些工具。谢谢【参考方案6】:

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

软件安全技术是不完善的,AFAIK 他们预先假定编译器中的错误很少,以及“完美”的硬件(即处理器正确解释机器代码)。

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

【讨论】:

【参考方案7】:

其中包含if 的一行没有什么不安全的。

如果代码在您的服务器上运行,那么重要的是该服务器的安全性。如果黑客获得了访问权限,无论您的代码多么复杂,他都能绕过它。

同样,如果您的代码在潜在攻击者的计算机上运行(例如您想要保护的计算机游戏),则您无法阻止攻击者。你可以让他的工作稍微难一些,但仅此而已。

您不应该担心一条线路的安全性,而应该担心整个系统的安全性。如果你让你的代码更复杂,你所做的只是引入更多潜在的错误。使用更复杂的代码是一种通过晦涩难懂的安全性尝试,这是行不通的。

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

【讨论】:

以上是关于“if”语句的安全性如何?的主要内容,如果未能解决你的问题,请参考以下文章

Kotlin空安全 ③ ( 手动空安全管理 | 非空断言操作符 !! | 使用 if 语句判空 )

如果第一个条件为假,假设 if-and 语句总是会中断是不是安全? [复制]

java 导致多线程数据安全问题的原因

求 存储过程和Sql语句之间的区别 余额准确越好

Swift 中的单行 if 语句

如何在 php 中创建安全的 mysql 准备语句?