什么时候PHP代码应该被视为不安全?

时间:2012-10-26 20:01:57

标签: php security

昨天我参加了PHP开发人员职位的采访。我的工作是解决15个问题相当简单的测试。其中一个问题是决定类似下面的代码应被视为不安全。我给出了一个错误(事实证明)答案,而另一个人在那次采访中的论证非常令人惊讶(至少对我而言)。

代码是这样的:

function someFunction($a)
{
    echo $a * 4;
}

someFunction($_GET['value']);

可能的答案是:

  • 总是,
  • 仅在启用register_globals
  • 从未。

你可以得到一分正确答案,第二点就答案选择答案给出了很好的解释(论证)。

我的回答是第三个:此代码永远不安全。加论证:因为,这只是一个简单的等式。这里没有文件或数据库操作,没有流,协议,没有任何东西。这只是一个等式。没有其他的。攻击者无法对PHP脚本做任何错误,无论他或她将尝试执行的URL查询格式错误。没机会。

我得到零分。我的答案都不正确,也没有接受我的论证。正确答案是:此代码始终不安全 - 您应该始终转义,您从网址查询中获取的内容。

我的问题是:这是非常好的观点吗?我们是否真的必须始终使用经验法则,如果不以任何其他方式过滤,转义或保护,直接从查询中获取的任何内容都是不安全的?这是否意味着,我教给我的学生一种无法编写的编码方法,因为他们在第一次PHP演讲中编写了一个用于计算三角形区域的脚本,他们在任务中使用未经过滤的未经过滤的params吗?

我理解,安全性和编写安全代码应该是最优先考虑的问题。但是,另一方面,并​​不是一点点安全代码法西斯主义(原谅我,如果我冒犯了某人)威胁任何不安全的代码,即使没有人能够做到对它有害吗?

或许我完全错了,你可以对与第四次相呼应的功能造成一些伤害,你给了它什么?

3 个答案:

答案 0 :(得分:7)

问题是以后有人可能会改变功能“某些功能”。而且不仅仅是将它乘以4。

该功能本身并不安全,但行:

 someFunction($_GET['value']);

完全不安全。也许someFunction会被重构到另一个文件中,或者在代码中被忽略。 你应该检查和擦除用户提供的数据,以保护自己和在图书馆或某个地方工作的其他人,而不是期望你传递纯$ _GET数组数据。

在与他人合作时尤其如此,这也是他在面试中被问到的原因 - 看看你是否展望未来的潜在问题,而不是看到你现在理解someFunction通过可能危险的GET数据时是无害的。当您的同事重构someFunction以查询数据库表时,它就会成为一个问题。

答案 1 :(得分:0)

没有花太多时间玩你的代码示例,我不会说它可以用来“伤害”但是,除非传递某种形式的数字,否则你的函数将无法正常工作。从长远来看,最好逃避你的代码,处理错误的数据,然后等待一个毫无戒心的用户在你的盒子中放入错误类型的值并破坏事物的那一天。 我确信你正在面试的公司只是在寻找一个有着确保他们的代码完整且牢不可破的坚固习惯的人。

答案 2 :(得分:0)

从不信任来自用户的任何内容。不,不。即使您无法理解您的代码/类/包被滥用的可能性,也要确保您的产品输入完全您所期望的内容,而不是任何惊喜。在最低限度,有人可能会为该方法提供错误的输入,只是为了搞砸你的应用程序,导致它显示错误或给白屏死机。做基本乘法的代码是这种恶意的主要候选者。它不仅适用于PHP,还适用于编程/设计。