昨天我参加了 PHP 开发者职位的面试。我的工作是解决 15 个相当简单的测试题。问题之一是决定是否应该将类似于下面的代码视为不安全的。我给出了一个错误的答案(事实证明),并且在那次采访中另一个人的论点非常令人惊讶(至少对我来说)。
代码是这样的:
function someFunction($a)
{
echo $a * 4;
}
someFunction($_GET['value']);
可能的答案是:
- 总是,
- 仅当
register_globals
启用时, - 绝不。
正确答案可以获得一分,对所选答案给出很好的解释(论证)可以获得第二分。
我的答案是第三个:这段代码永远不会不安全。加上论证:因为,这只是一个简单的等式。这里没有文件或数据库操作,没有流、协议,什么都没有。这只是一个等式。没有其他的。攻击者无法对 PHP 脚本做任何错误,无论他或她将尝试执行的格式错误的 URL 查询如何。没有机会。
我得了零分。我的回答都不正确,我的论点也不被接受。正确的答案是:这段代码总是不安全的——你应该总是逃避,你从 URL 查询中得到了什么。
我的问题是:这种观点真的很好吗?我们真的必须始终使用经验法则,即直接从查询中获取的任何内容都是不安全的,如果没有过滤、转义或以任何其他方式保护?这是否意味着,我教我的学生一种不安全的编码方法,因为在第一次 PHP 讲座中,他们编写了一个用于计算三角形区域的脚本,并且他们在任务中使用了来自 URL 的未转义、未过滤的参数?
我理解,安全性和编写安全代码应该是最高优先级的问题。但是,另一方面,这不是一点点安全代码法西斯主义(请原谅我,如果我冒犯了某人)来威胁任何不安全的代码,即使没有人能够对它造成任何伤害?
或者也许我完全错了,你可以对四次回声的功能造成一些伤害,你给它什么?