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

tre*_*der 10 php security

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

代码是这样的:

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

someFunction($_GET['value']);
Run Code Online (Sandbox Code Playgroud)

可能的答案是:

  • 总是,
  • 仅在register_globals启用时
  • 决不.

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

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

我得到零分.我的答案都不正确,也没有接受我的论证.正确的答案是:这段代码总是不安全的 - 你应该总是逃避,你从URL查询得到什么.

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

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

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

Ray*_*Ray 7

问题是,以后某人可能会更改"某种功能"功能,而不仅仅是将其乘以4.

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

 someFunction($_GET['value']);
Run Code Online (Sandbox Code Playgroud)

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

在与他人合作时尤其如此,这就是为什么在面试中被问到 - 看看你是否展望未来的潜在问题,而不是看到你了解someFunction当传递可能危险的GET数据时当前是无害的.当您的同事重构someFunction以查询数据库表时,这将成为一个问题.

  • @trejder防范恶意用户数据是基本的编程101而不是过度偏执.这不是一个棘手或棘手的问题. (2认同)