PHP 或/和 JavaScript 中的冗余安全性


Redundant safety in php or/and javascript

我经常使用 php 和 javascript,我一直想知道我的代码中是否有冗余的安全性,例如在第 10 行左右,我有类似下面的代码

if(!isset($_GET['id']) || !is_numeric($_GET['id'])){
    header("Location: ./?error=1"); exit;
}

然后在 JavaScript 中,我var battleId = "<?php echo htmlentities($_GET['id']); ?>";这样的代码是多余的吗?我一直在想,因为我已经在页面顶部检查过,$_GET['id']不可能是一个数字,因为那样他们就不会到达 javascript 代码。

我的MySQL调用也是如此,它可能看起来像这样

$checkCharacter = getServer() -> prepare("SELECT COUNT(*) FROM `battle_character` WHERE `character_id`=:characterId AND `battle_id`=:battleId");
$checkCharacter -> bindParam(":characterId", $c->getId());
$checkCharacter -> bindParam(":battleId", $_GET['id']);
$checkCharacter -> execute();

我是否有必要使用 prepare 和 bindParam,当我知道 get 已经在页面顶部进行了检查,并且对象$c->getId()只能是一个数字,而且更切中要害。这些额外的安全代码是否比帮助更减慢网站的速度?

您正在使用预准备语句,这是一个很好的做法。继续这样做。isset、is_numeric 或 htmlentities 的性能影响可以忽略不计,不会对性能产生任何影响。

即使问题过于宽泛或基于意见,我也想发布答案:

    可以使用
  1. 这两种方法(重定向和输出转义),因为这些操作提供了不同的意图(验证和输出)。稍后,您或其他人将更容易复制样式,当他们将输出其他变量(未经验证)或仅向变量添加验证(即使此变量未打印)时。

  2. 不要使用 htmlspecial chars 来输出 javascript - 这是错误的,因为 html 和 javascript 有不同的特殊符号。

  3. 始终使用 bindparam,无论您从何处获取数据以及如何验证它们都无关紧要。它不仅更安全,而且通常更快、更干净(比字符串连接)