“if”声明有多安全?

时间:2011-10-28 14:30:42

标签: security if-statement logic

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

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

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

因为它只有一条线我觉得破坏可以相对简单。我忽略了一些事情,还是一个if真的是最好的方法呢?

7 个答案:

答案 0 :(得分:4)

你是对的,这样的if很容易被黑客入侵。如果一个反向设计此应用程序,您可以轻松修改一些指令以跳过if

有各种选项,例如混淆可执行文件或添加更复杂的检查,以及将它们添加到应用程序的各个位置。但无论你做什么,你的应用程序总是会被黑客入侵。

最好的事情是不要担心它。当你的应用程序如此优秀和广泛使用,人们实际上愿意努力破解它时,你可能会赚到足够的钱来更好地保护它。在那之前,想想它是浪费时间。

答案 1 :(得分:2)

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

答案 2 :(得分:2)

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

答案 3 :(得分:2)

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

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

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

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

在这种情况下,正则表达式在字符串中的任何地方寻找.js,而不是强制它在最后。

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

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

答案 4 :(得分:1)

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

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

答案 5 :(得分:0)

我不确定你的问题。

软件安全技术不完善,AFAIK预先假设编译器中存在少量错误,而“完美”硬件(即处理器正确解释机器代码)。

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

答案 6 :(得分:0)

其中一行if没有任何不安全因素。

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

同样,如果您的代码在潜在攻击者的计算机上运行(如您要保护的计算机游戏),则无法阻止攻击者。你可以让他的工作稍微困难一点,但就是这样。

您不应该担心一条线路的安全性,而应该担心整个系统的安全性。如果你使代码更复杂,你所做的就是引入更多的bug。使用更复杂的代码是通过默默无闻的尝试,这是无效的。

如果您无法相信您的计算机正确执行简单的if,那么您根本无法信任它。