Security “安全性”有多高;如果;陈述

Security “安全性”有多高;如果;陈述,security,if-statement,logic,Security,If Statement,Logic,不管使用哪种语言,我总是对通过if的安全性概念感到困惑。我写的所有代码都依赖于带有if语句的那一行的成功: user = getUserName(); password = getPassword(); if (match(user, password)) { print secret information; } 因为这只是一条线,我觉得破坏可以相对简单。是我忽略了事情,还是一个if真的是最好的方法呢?你是对的,像这样的if很容易被黑客攻击。如果有人对此应用程序进行反向工程,您可以

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

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

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

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

你是对的,像这样的
if
很容易被黑客攻击。如果有人对此应用程序进行反向工程,您可以轻松修改一些指令以跳过
If

有多种选择,比如混淆可执行文件或添加更复杂的检查,然后在应用程序的不同位置添加它们。但无论你做什么,你的应用程序总是会被黑客入侵


最好的事情是不要担心它。当您的应用程序非常好、非常好并且被广泛使用,以至于人们实际上愿意努力破解它时,您可能会赚到足够的钱来更好地保护它。在那之前,想一想都是浪费时间。

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

软件安全技术是不完善的,而且它们预先假定编译器中几乎没有bug,并且是“完美”的硬件(即处理器正确解释机器代码)


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

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


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

在您展示的特定案例中,如果您真的担心未经授权的人看到“打印机密信息”输出的机密信息,您可以使用提供的密码对“机密信息”进行加密。这将确保只有能够提供正确密码的人才能看到机密信息

如果一行中有
if
,那么它就没有什么不安全的地方了

如果代码在您的服务器上运行,那么重要的是服务器的安全性。如果黑客能够访问它,不管你的代码有多复杂,他都能够绕过它

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

您不应该担心一条线路的安全性,而是整个系统的安全性。如果您使代码变得更复杂,您所做的就是引入更多潜在的bug。使用更复杂的代码是一种通过晦涩来确保安全的尝试,但这是行不通的


如果你不能信任你的计算机正确地执行一个简单的
If
,你就根本不能信任它。

关于If有一点经常被忽视。这叫定时攻击。假设您有一个web应用程序,它根据发送的密码与存储在DB中的密码的直接匹配来进行比较(是的,我知道他心目中没有人会将密码存储在DB中,但正如柴郡猫所说,“我们在这里都疯了”)。然后,根据密码在第一个字符、第二个字符还是最后一个字符上不匹配,比较过程需要不同的时间。虽然时间差看起来很小,但即使是在互联网上,攻击者也可以尝试猜测密码,而不需要进行本地分析。定时攻击比我描述的要复杂一些,但一般来说,若比较不是100%安全的,至少不是在所有情况下

if语句是绝对安全的,永远不会导致漏洞。代码中几乎所有其他内容都会产生漏洞

您使用的比较运算符可能有缺陷。例如,
=
操作符在接受模糊匹配的地方使用模糊匹配。这可能对安全性不好,但很难想出一个好的例子,密码并不重要。一个简单的
$password==$\u GET['password']
应该可以正常工作

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

if(preg\u match('/(.+)\\\.js/'.$\u GET['file'])){
readfile($_GET['file']);
}
在本例中,正则表达式在字符串中的任意位置查找.js,而不是强制将其放在末尾

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

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

“蓄意破坏”?如果攻击者具有对源代码的写访问权限,那么无论如何,您都会受到攻击。此外,还有什么选择?使整个逻辑如此复杂和混乱,以至于攻击者和维护者都无法理解它?即使如此,任何严重的攻击者都会通过任何模糊和复杂的安全方案进行攻击——只要看看音乐、电影、视频游戏等的盗版行为就知道了。不,我是在问来自外部的攻击。攻击者如何能够在不访问代码的情况下攻击您的代码?@Mikhail,我希望我的储蓄帐户不受一条线的保护,但是由一个深入了解安全性并审查所有相关代码的团队组成。我对@svick抱有同样的希望,但我也不会感到惊讶,如果最终在SSL和加密、哈希和盐渍以及牺牲一只山羊来击退邪恶的攻击者之后,是否允许使用我的银行帐户的决定是使用<代码>如果语句,并且这些专家正确地认为整个事情是安全的。我不认为一个
if
有什么特别的地方-你得找个分支