【问题标题】:Is there a way to test if a string is gzdeflated?有没有办法测试一个字符串是否被 gzdeflated?
【发布时间】:2013-01-17 11:43:06
【问题描述】:

也就是说,测试我是否可以安全地gzinflate字符串。

如果我的压缩数据被篡改,我会收到“错误数据”警告。我不想抑制警告,这意味着我要么必须捕获它,要么测试它是否可以被 gzinflated。后者是我的首选解决方案,但我就是不知道怎么做。

适合以下代码示例的东西会很完美:

if(i_can_haz_inflate($data))
{
    // go ahead
    $source = gzinflate($data);
}
else
{
    // bad data
}

编辑:在指定 gz(de|in)flate 之后,我开始意识到我实际上并不太在意压缩算法。有没有更适合在尝试解压之前检查完整性的方法?

【问题讨论】:

  • Deflate 不会添加魔术字节来显示它是哪种编码,因为这意味着结果会占用更多空间。实现这一目标的唯一方法就是尝试一下,看看是否有问题。
  • 也就是说:实际上是放气的缺陷导致它在篡改时失败。完美的压缩算法将允许任何数据作为输入。

标签: php compression


【解决方案1】:

gzinflate() 如果不是gzdeflate() 编码字符串,则返回原始字符串。

最明显的检查是:

$deflated = @gzinflate($data); // to avoid getting a warning
if ($data != $deflated && $deflated !== FALSE) {
     $source  = gzinflate($data);
}

我认为没有其他方法可以做到这一点。

【讨论】:

  • -1 引用 OP:“如果我的压缩数据已被篡改,我会收到“错误数据”警告。我不想抑制警告,这意味着我要么必须捕获它,或测试它是否可以被gzinflated。”
  • 这种方法可能仍然是最好的方法。我知道稍后尝试提问不是 PHP 风格(实际上是 Python 风格),但它仍然是最好的方法。
  • 我同意戈登的观点,但我认为没有其他方法可以做到这一点。
  • 只需拨打一个gzinflate() 电话,该代码肯定会更高效。但是前两个需要有抑制器 (@) 修饰符,我真的宁愿避免。可能只是最好的选择..
  • gzinflate() 在出错的情况下返回原件这一事实是关键,谢谢。
【解决方案2】:

我同意@Vlad Preda answer,但我们可以将警告转换为异常:

set_error_handler(function ($code, $description) {
    throw new \RuntimeException($description, $code);
});
$deflated = gzinflate($data);
restore_error_handler();

它为我们提供了处理异常的能力......并且不抑制警告......

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-04
    • 2011-12-04
    • 1970-01-01
    • 2020-03-15
    • 2010-09-11
    • 1970-01-01
    • 2016-10-01
    相关资源
    最近更新 更多