昨天我参加了PHP开发人员职位的采访.我的工作是解决15个问题相当简单的测试.其中一个问题是决定类似下面的代码应被视为不安全.我给了一个错误(事实证明)答案,而另一个人在那次采访中的论证是相当令人惊讶的(至少对我而言).
代码是这样的:
function someFunction($a)
{
echo $a * 4;
}
someFunction($_GET['value']);
Run Code Online (Sandbox Code Playgroud)
可能的答案是:
register_globals
启用时你可以得到一个正确答案的答案,第二个答案就答案选择答案给出了很好的解释(论证).
我的答案是第三:这段代码永远不安全.加论证:因为,这只是一个简单的等式.这里没有文件或数据库操作,没有流,协议,没有任何东西.这只是一个等式.没有其他的.攻击者无法对PHP脚本做任何错误,无论他或她将尝试执行的URL查询格式错误.没有机会.
我得到零分.我的答案都不正确,也没有接受我的论证.正确的答案是:这段代码总是不安全的 - 你应该总是逃避,你从URL查询得到什么.
我的问题是:这是非常好的观点吗?我们是否真的必须始终使用经验法则,如果不以任何其他方式过滤,转义或保护,直接从查询中获取的任何内容都是不安全的?这是否意味着,我教给我的学生一种无法编写的编码方法,因为他们在第一次PHP演讲中编写了一个用于计算三角形区域的脚本,并且他们在任务中使用未经过滤的未经过滤的params?
我理解,安全性和编写安全代码应该是最优先考虑的问题.但是,另一方面,不是一点安全代码法西斯主义(原谅我,如果我冒犯了某人)威胁任何不安全的代码,即使没有人能够对它做任何伤害?
或者也许我完全错了,你可以对与第四次相呼应的功能做一些伤害,你给它的是什么?
问题是,以后某人可能会更改"某种功能"功能,而不仅仅是将其乘以4.
该功能本身并不安全,但行:
someFunction($_GET['value']);
Run Code Online (Sandbox Code Playgroud)
完全不安全.可能someFunction
会被重构到另一个文件中,或者在代码中被删除.您应该检查并清理用户提供的数据,以保护自己和在图书馆或某个地方工作的其他人,而不是期望您传递纯$ _GET数组数据.
在与他人合作时尤其如此,这就是为什么在面试中被问到 - 看看你是否展望未来的潜在问题,而不是看到你了解someFunction
当传递可能危险的GET数据时当前是无害的.当您的同事重构someFunction以查询数据库表时,这将成为一个问题.