昨天我参加了PHP开发者职位的面试。我的工作是解决15个相当简单的测试题。其中一个问题是决定是否应将类似下面的代码视为不安全。 我给出了错误的答案(事实证明),那次面试中另一个人的论证方式非常令人惊讶(至少对我来说是这样)。
代码大概是这样的:
function someFunction($a)
{
echo $a * 4;
}
someFunction($_GET['value']);
可能的答案是:
- 总是,
- 只有在启用了
register_globals
时, - 从不。
如果选择了正确答案并给出了好的解释(论据),你可以得到一分。
我的答案是第三个:这段代码永远不会存在安全问题。此外,我还给出了论据:因为这只是一个简单的等式。在这里没有文件或数据库操作,没有流、协议,也没有其他任何东西。它只是一个等式。没有别的。攻击者无法对PHP脚本做出任何错误的行为,无论他或她尝试执行多么畸形的URL查询。根本不可能。
我得到了零分。既没有答对,也没有接受我的论据。正确答案是:这段代码总是存在安全问题--您应该始终转义来自URL查询的数据。
我的问题是:这真的是一个好观点吗?我们是否真的必须始终遵循一个经验法则,即如果没有过滤、转义或以其他方式保护,则直接从查询中获取的任何内容都是不安全的?这是否意味着,当我在第一节PHP课上让学生编写一个计算三角形面积的脚本,并在任务中使用未转义、未过滤的URL参数时,我教给他们不安全的编码方法?
我理解安全和编写安全代码应该是最高优先事项。但另一方面,是否将任何代码视为不安全,即使没有人能够对其造成任何伤害,这有点过于严苛了呢?(如果冒犯了某人,请原谅我)。
或者,也许我完全错了,你可以对将其乘以四倍的函数造成某些伤害吗?
$_GET
的实现方式。但这显然是一个诡计问题。当面对具体的实现时,您应该根据其具体情况进行判断,而不是基于概括或假设的过时服务器设置。难道所有问题都像这样吗? - mario