11

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

代码是这样的:

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

someFunction($_GET['value']);

可能的答案是:

  • 总是,
  • 仅当register_globals启用时,
  • 绝不。

正确答案可以获得一分,对所选答案给出很好的解释(论证)可以获得第二分。

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

我得了零分。我的回答都不正确,我的论点也不被接受。正确的答案是:这段代码总是不安全的——你应该总是逃避,你从 URL 查询中得到了什么。

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

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

或者也许我完全错了,你可以对四次回声的功能造成一些伤害,你给它什么?

4

3 回答 3

7

问题是稍后有人可能会更改函数“somefunction”并且做的不仅仅是将它乘以 4。

该函数本身并不是不安全的,而是以下行:

 someFunction($_GET['value']);

是完全不安全的。也许someFunction会被重构到另一个文件中,或者在代码中。您应该始终检查并清理用户提供的数据,以保护您自己和其他在某个库或函数上工作的人,而不是期望您将纯 $_GET 数组数据传递给他们。

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

于 2012-10-26T20:08:24.950 回答
0

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

于 2012-10-26T20:09:18.717 回答
0

永远不要相信来自用户的任何东西。只是不要。即使您无法理解您的代码/类/包被滥用的可能性,也要通过确保对您的产品的输入完全符合您的期望来掩饰自己的屁股,这并不奇怪。至少,有人可能会向该方法提供错误的输入,只是为了搞砸您的应用程序,导致它显示错误或出现白屏死机。进行基本乘法的代码是这种恶意的主要候选者。它不仅适用于 PHP,也适用于一般的编程/设计。

于 2012-10-29T01:57:52.990 回答