从数据库中检索数据时是否需要重新进行验证?

时间:2018-04-28 作者:Edward

我在将数据保存到数据库时进行验证,如下所示:

$data = validate($data);
update_post_meta($post_id, \'my_post_meta\', $data);
问题是,在从数据库读取数据时,是否需要再次进行验证?

$data = get_post_meta($post_id, \'my_post_meta\');
$data = validate($data); // Do validation again?

1 个回复
最合适的回答,由SO网友:Mark Kaplun 整理而成

简短的回答是“是”,较长的回答是“视情况而定”。

为什么需要验证?因为如果您有代码,如果与错误的参数一起使用,将删除wordpress(我知道这是一个非常糟糕的例子),那么您应该加倍确保它不是由某些DB损坏或更可能的错误过滤器触发的。

让我们看看这部处理特朗普领导下核武器状态的代码;)其中可以有“休眠”、“就绪”和“参与”的值。您可能认为这段代码足够了

switch ($nuclear_state) {
  case \'dormant\':...
    break;
  case \'ready\':....
    break;
  default : fire();
}
希望没有一个头脑正常的人会在他的代码中使用核战争选项作为默认选项,但我希望这可以很好地说明这种风险。

您的代码应该是

switch ($nuclear_state) {
  case \'dormant\':...
    break;
  case \'ready\':....
    break;
  case \'engaged\' : fire();
    break;
  default : exception(\'something is wrong with the system, notify admin\');
}
并简单地拒绝对不好的价值观采取行动。

这就是为什么您应该编写做事情的代码,而不是处理获取参数的代码。当你有一个API

function nuclear_state_change(string $state) {}
它可以很容易地验证这一点$state 有意义,并以可移植的方式在所有可能导致调用的流(html、json、ajax、xml rpc)之间引发异常,并让调用方处理异常。

显然,调用方自己验证会更好,但编码中的小开销是完全值得的,尤其是在开发过程中,存储和发送错误值的情况会更多。

那么,为什么会有“视情况而定”的答案呢?如果您完全控制了系统,那么您已经审核了所有代码,并且在没有完全审核的情况下从未安装任何新插件或升级主题,这可能只是一种开销。但这可能只适用于小型非复杂的一次性项目。对于复杂的项目,在某个时间点更可能发生不好的事情,您不希望它被忽视。

结束

相关推荐

Replace domain in database

我的网站受到攻击,所以基本上所有的核心php文件都已损坏。只剩下数据库。现在我在本地主机中进行了尝试。如果我想从这个数据库恢复我的站点,域名是我唯一需要替换字符串的东西吗</我找到了这个教程-Replace string in database - 更改所有表中的域字符串,但几乎不知道将其放入何处以及如何在wordpress中触发它