【问题标题】:php safe unserializephp安全反序列化
【发布时间】:2012-12-08 11:48:29
【问题描述】:

在php中使用反序列化时,处理变量无法反序列化的潜在情况最安全的方法是什么。

例如(我不会这样做,只是为了举例):

$myVar = true;

$result = unserialize($myVar);

这将返回 false,这很好。但它也会引发令人讨厌的通知。

我一直在做以下事情:

$result = @unserialize($myVar);

感觉很hacky。那么当有可能出现错误时,最好的反序列化方法是什么

【问题讨论】:

  • 我想理想的解决方案是仅反序列化您确定包含序列化字符串的变量。出于安全原因,您不应该接受来自不受信任的外部源的序列化 PHP 数据,因此您应该能够非常确信您认为是序列化字符串的变量确实如此。如果你对此没有信心,那你的问题就更大了。
  • 我有点认为“讨厌的通知”是对失败的反序列化的一个很好的回复(无论如何,您可以也不应该为实时站点显示这些通知)。你所说的“最安全”和“最好”到底是什么意思?如果您不担心收到错误通知,我认为@unserialize 很好。
  • @Spudley 我完全明白你在说什么。我想这实际上是这里真正的挑战。由于我的问题的性质,我根本看不到确保我正在加载的模型将始终具有此特定属性集和序列化的方法。
  • php 说由于Unserialization can result in code being loaded and executed due to object instantiation and autoloading, and a malicious user may be able to exploit this. 出了点问题,请参阅手册的最后一节:php.net/manual/en/function.unserialize.php
  • 是的。无论您是否使用 Javascript,JSON 都非常适合传输数组数据。它现在几乎已成为此类事物的跨语言标准。

标签: php


【解决方案1】:

您可以使用带有 try / catch 的错误处理程序:

set_error_handler('exceptions_error_handler');
function exceptions_error_handler($severity, $message, $filename, $lineno) {
  if (error_reporting() == 0) {
    return;
  }
  if (error_reporting() & $severity) {
    throw new ErrorException($message, 0, $severity, $filename, $lineno);
  }
}
$string = 'bob';
try {
   $result = unserialize($string);
} catch (Exception $e) {
   echo 'Caught exception: ',  $e->getMessage(), "\n";
}
if(isset($result)) {
    //Continue code for valid serialized array here
}

【讨论】:

  • 但是,就像上面的 cmets 一样,我会推荐 JSON 而不是序列化数组。我正在回答发布的问题。
猜你喜欢
  • 2012-03-25
  • 1970-01-01
  • 2017-04-03
  • 1970-01-01
  • 2021-11-21
  • 1970-01-01
  • 2010-10-17
  • 2011-02-02
相关资源
最近更新 更多