授权验证指南

我应该怎么验证授权以防被破解?有了Z5加密,你就可以通过写一些特殊的逻辑,来防止破解了。这不是必须的修改,而只是一种防破解的实践。

我们假设你现在写了一个12306刷票插件,它的服务端在你的服务器上。你写了一个Z-Blog插件,这样,你的客户的网站就可以通过这个插件,向你的服务器请求刷票了。

为了最大程度地避免你的API被太多人知道,你把向你服务器发送请求的部分当成了你的插件的核心代码。(这种行为完全保护不了你的API安全,请注意,千万不要相信客户端数据。但这里只是示例。)。你不希望你的核心代码被别人破解。同时,你只希望通过应用中心购买的用户使用你的插件,就算有人复制给别人,收到复制品的人也不能用。

它还有一些外围代码,例如,显示一个抢票页面、显示子菜单等等。

那我们可以写出这样的几个函数:

function 刷票 ($id) {
  $password = '?password=123456';
  $ret = file_get_contents('你的刷票服务器' . $password);
  return $ret;
}

function 查询余票 ($id) {
  $password = '?password=234567';
  $ret = file_get_contents('你的刷票服务器' . $password);
  return $ret;
}

function 显示抢票 () {
  echo '<div>抢票</div>';
}

关门捉贼

既然你不希望你的核心代码被人破解,那你完全可以加密你的核心代码。在调用核心函数的同时,顺便验证一下授权,就能达成二者兼可得之的效果。

/**
 *@Z5Encrypt
 */
function 刷票 ($id) {
  if (AppCentre_VerifyV2('xxxxxxx') === 'xxxxxxx') {
     exit '验证失败';
  }
  $password = '?password=123456';
  $ret = file_get_contents('你的刷票服务器' . $password);
  return $ret;
}

/**
 *@Z5Encrypt
 */
function 查询余票 ($id) {
  if (AppCentre_VerifyV2('xxxxxxx') === 'xxxxxxx') {
     exit '验证失败';
  }
  $password = '?password=234567';
  $ret = file_get_contents('你的刷票服务器' . $password);
  return $ret;
}

/**
 *@Z5Encrypt
 */
function InstallPlugin_12306抢票() {
  // 这里是安装你的插件的时候一定会调用到的函数
  // 当然要验证以后,才能写入初始配置信息
  // 如果验证失败,强制停用插件
}

无中生有

为了混淆破解者的视听,让他们找不到验证函数可能存在哪儿,你也可以试试加密一些无关紧要的函数。如果你认为一点点性能损失是可以接受的,那么,你甚至可以加密你代码用到的大部分函数。

例如:

/**
 *@Z5Encrypt
 */
function 显示抢票 () {
  // 加密,但是不验证授权
  echo '<div>抢票</div>';
}

瞒天过海

考虑到,验证授权很可能是一项速度较慢、代价较高的操作。因此,如果把验证授权放置在后台界面等经常被访问到的地方,就必须降低验证频率。这样的话,潜在的破解者就有可能无法发现所有的授权验证处,让盗版用户因为破解不完全而用得“不爽”;正常用户也不会受到太大的影响。

在加密的帮助下,我们可以写各种奇特的条件判断来验证授权。

/**
 *@Z5EncryptEntire
 */
function 生成后台导航栏($id) {
  if (rand() % 6 === 0) { // 有1/6的概率触发授权验证
    验证授权
  }
}
function 生成标题 () {
  if (time() % 60 === 0) { // 如果用户正好在x分0秒访问后台,触发验证
    验证授权
  }
}
function 随便什么函数 () {
  if (今天天气不错) {
    验证授权
  }
}

不能这么做

  1. 不要把你的授权验证单独抽出来做成一个函数,如下:
/**
 *@Z5EncryptEntire
 */
function 授权验证 () {
  if (AppCentre_VerifyV2('xxxxxxx') === 'xxxxxxx') {
     exit '验证失败';
  }
  return true;
}

function 刷票 () {
  授权验证();
  $password = '?password=123456';
  $ret = file_get_contents('你的刷票服务器' . $password);
  return $ret;
}

这种情况下,你的加密没有任何用途,破解者只需要重写你的授权验证函数即可。请务必将你的验证代码复制到每一个需要验证的地方。

Z-Blog 应用中心注意事项

  1. 不要加密ActivePlugin_XXXX函数。加密本身的运行效率较低,加密此函数会导致你的客户的网站整个变慢。

  2. 禁止在前台主题验证授权。