盲目信任

在我 11 岁左右的时候,有一次我坐在物理课上,手里拿着数量有限的量角器。小小年纪的我是个狡猾的短刀手,我决定不再等待,直接描摹别人画的图。这让我当时的物理老师大吃一惊,他停住脚步,大声喊道:"不!物理就是要精确!"

他说得有道理,这在编程领域也同样适用。

为了避免盲目相信,你应该注意以下错误:

  • 未检查返回类型

  • 未检查数据模型

  • 假定数据库中的数据是正确的或符合您期望的格式

让我们更进一步,看看这段代码:

<?php

$isAdmin = false;
extract($_GET);

if ($isAdmin === true) {
    echo "Hey ".$name."; here, have some secret information!";
}

在前面的代码中,有两个关键错误。第一个错误是我们直接提取 GET 变量;我们将远程定义的变量导入当前符号表,实际上允许任何人覆盖提取前定义的任何变量。

此外,我们在返回 GET 变量时没有对其进行消毒,这显然存在 XSS 漏洞。

因此,我们可以这样做:

<?php

$isAdmin = false;

if ($isAdmin === true) {
    echo "Hey ".htmlspecialchars($_GET['name'])."; here, have some secret information!";
}