999yzc亚洲城在线娱乐城PHP hash_equals polyfill

( 999yzc亚洲城在线娱乐城 )

在 php.net 看到一個版本,然而卻有很多 downvotes,不知爲何。

if!function_existshash_equals {
  function hash_equals$str1, $str2 {
    ifstrlen$str1 != strlen$str2 {
      return false;
    } else {
      $res = $str1 ^ $str2;
      $ret = 0;
      for$i = strlen$res - 1; $i >= 0; $i-- $ret |= ord$res[$i];
      return !$ret;
    }
  }
}

如果這個函數真的不好,請說明原因,最好還能給出替代解決方案,謝謝。


從 stackoverflow 看到其實現如下:

PHP_FUNCTIONhash_equals
{
    /* ... */

    if Z_STRLEN_Pknown_zval != Z_STRLEN_Puser_zval {
        RETURN_FALSE;
    }

    /* ... */

    /* This is security sensitive code. Do not optimize this for speed. */
    for j = 0; j < Z_STRLEN_Pknown_zval; j++ {
        result |= known_str[j] ^ user_str[j];
    }

    RETURN_BOOL0 == result;
}

貌似和上面的 polyfill 沒什麼區別啊

因为类型不严格,导致如果攻击者能够通过某种方式控制入参的类型,可以攻击

phpfunction bug_hash_equals$str1, $str2 {
    ifstrlen$str1 != strlen$str2 {
      return false;
    } else {
      $res = $str1 ^ $str2;
      $ret = 0;
      for$i = strlen$res - 1; $i >= 0; $i-- $ret |= ord$res[$i];
      return !$ret;
    }
}

var_dumpbug_hash_equalsaaabbb, 0.0001;//true

http://sandbox.onlinephpfunctions.com/code/e7c978d047486534441403a88680cefb85b1a48c

(看完/读完)这篇文章有何感想! 999yzc亚洲城在线娱乐城的分享…

发表评论

电子邮件地址不会被公开。 必填项已用*标注