何时应将 PHP 代码视为不安全?

11

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

代码大概是这样的:

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

someFunction($_GET['value']);

可能的答案是:

  • 总是,
  • 只有在启用了register_globals时,
  • 从不。

如果选择了正确答案并给出了好的解释(论据),你可以得到一分。

我的答案是第三个:这段代码永远不会存在安全问题。此外,我还给出了论据:因为这只是一个简单的等式。在这里没有文件或数据库操作,没有流、协议,也没有其他任何东西。它只是一个等式。没有别的。攻击者无法对PHP脚本做出任何错误的行为,无论他或她尝试执行多么畸形的URL查询。根本不可能。

我得到了零分。既没有答对,也没有接受我的论据。正确答案是:这段代码总是存在安全问题--您应该始终转义来自URL查询的数据。

我的问题是:这真的是一个好观点吗?我们是否真的必须始终遵循一个经验法则,即如果没有过滤、转义或以其他方式保护,则直接从查询中获取的任何内容都是不安全的?这是否意味着,当我在第一节PHP课上让学生编写一个计算三角形面积的脚本,并在任务中使用未转义、未过滤的URL参数时,我教给他们不安全的编码方法?

我理解安全和编写安全代码应该是最高优先事项。但另一方面,是否将任何代码视为不安全,即使没有人能够对其造成任何伤害,这有点过于严苛了呢?(如果冒犯了某人,请原谅我)。

或者,也许我完全错了,你可以对将其乘以四倍的函数造成某些伤害吗?


你在面试期间正在工作?太有趣了。 - Salman A
2
一个提示:如果面试官给出一段代码并询问是否不安全,如果存在某些获取变量,请始终说它是不安全的,即使这与您的逻辑相悖。 - itachi
取决于您对 $_GET 的实现方式。但这显然是一个诡计问题。当面对具体的实现时,您应该根据其具体情况进行判断,而不是基于概括或假设的过时服务器设置。难道所有问题都像这样吗? - mario
@mario:不!:]只有十五个中的四五个!但是是的 - 面试后我有点头痛!:] - trejder
3个回答

7

问题在于后来可能有人会修改函数'somefunction'并且执行除了简单乘以4之外的其他操作。

这个函数本身并不是不安全的,但是这一行代码:

 someFunction($_GET['value']);

这是完全不安全的。也许 someFunction 被重构到另一个文件中或者在代码中深层次使用。

为了保护自己和其他人,防止向某些未考虑纯净 $_GET 数组数据的库或函数传递数据,您应该始终检查和清除用户提供的数据。

特别是在与他人合作时,这一点尤其重要,这也是为什么在面试中会问及此问题——看看您是否能够预见未来的潜在问题,而不是只是理解当前情况下通过可能存在风险的 GET 数据传递给 someFunction 是无害的。当您的同事将 someFunction 重构为查询 DB 表时,这将成为一个问题。


1
+1,还要查看这个答案 - The Alpha
我认为进行输入验证是一般性的,但我不同意应该尝试预测或预期结果将用于哪些未来情境,或者未来某人可能如何修改代码。 - goat
虽然我基本上同意你的答案,但我也同意_rambo coder_的评论。这让我想起了一个朋友的想法:在CSS的最后一条规则中,即使是最后一条规则,你也应该始终添加分号,因为“有人可能会想要添加一些内容,但可能没有看到末尾没有分号”。让我们不要变得过于偏执。 - trejder
2
@trejder 防范恶意用户数据是基本的编程101,而不是过度偏执。这不是一个困难或诡计问题。 - Ray
@Ray:我必须同意你的观点。感谢你提供了这么多有价值的信息。 - trejder
显示剩余4条评论

0

由于我没有花太多时间玩弄您的代码示例,因此我不会说它可能被用于“做坏事”,但是除非传递某种形式的数字,否则您的函数将无法正常工作。从长远来看,最好对代码进行转义并处理错误数据,而不是等待那一天,即一个毫不知情的用户将错误类型的值放入您的框中并破坏事物。

我相信您面试的公司只是在寻找一个具有确保其代码完整且不可破坏习惯的人。


Sarn,我不会给你投反对票,因为你是新手,没有很多积分,但是是的,代码中的示例很危险。 - Ray

0

永远不要相信来自用户的任何东西。即使你无法想象你的代码/类/包被误用的可能性,也要通过确保产品的输入是完全符合你期望的来保护自己,避免出现意外情况。至少,有人可能会提供错误的输入到该方法中,只是为了捣乱你的应用程序,导致它显示错误或白屏。执行基本乘法的代码是这种恶意行为的主要候选者。这不仅适用于PHP,而且适用于编程/设计的所有领域。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接