2017-04-03 54 views
1

我遵循了关于如何在服务器上托管您的(高级)插件以实现自动更新的指南。一切正常,但一点都不安全。该插件的ZIP链接是公开的,任何人都可以下载。在服务器上托管优质WordPress插件以实现自动更新

这里是update.php文件(我的服务器上)的样子:

if (isset($_POST['action'])) { 
    switch ($_POST['action']) { 
     case 'version': 
      echo "3.1.1"; 
      break; 
     case 'info': 
      $obj    = new stdClass(); 
      $obj->slug   = '...'; 
      $obj->plugin_name = '...'; 
      $obj->new_version = "3.1.0"; 
      $obj->requires  = '4.7'; 
      $obj->tested  = '4.7.3'; 
      $obj->downloaded = 12540; 
      $obj->last_updated = '2017-02-12'; 
      $obj->homepage  = '...'; 
      $obj->sections  = array(
       'description' => '...' 
      ); 
      $obj->download_link = 'https://.../latest.zip'; 
      echo serialize($obj); 
      break; 
     case 'license': 
      echo 'false'; 
      break; 
    } 
} else { 
    header('Cache-Control: public'); 
    header('Content-Description: File Transfer'); 
    header('Content-Type: application/zip'); 
    readfile('latest.zip'); 
} 

该脚本将始终返回.zip文件,如果没有提供POST参数(版本,信息或许可) 。

我只需要一个参数发送到update.php,当WordPress请求新的.zip文件时,我可以授权下载。

即使有人知道这个过程记录在哪里,这也会有很大帮助。

+0

所以你想通过POST发送一个参数进行验证?但是你正在检查isset文章,所以如果你甚至发送一个额外的参数进行身份验证,它永远不会到别的地方? – Thamaraiselvam

+0

要么是这个,要么我需要知道如何让WP请求“license”POST参数。 –

回答

0

这就是WordPress如何在安装新插件时向其服务器发送POST请求。

array ( 'method' => 'POST', 'timeout' => 15, 'redirection' => 5, 'httpversion' => '1.0', 'user-agent' => 'WordPress/4.7.3; http://example.com/', 'reject_unsafe_urls' => false, 'blocking' => true, 'headers' => array ( ), 'cookies' => array ( ), 'body' => array ( 'action' => 'plugin_information', 'request' => 'O:8:"stdClass":4:{s:4:"slug";s:7:"jetpack";s:6:"fields";a:1:{s:8:"sections";b:0;}s:8:"per_page";i:24;s:6:"locale";s:5:"en_US";}', ), 'compress' => false, 'decompress' => true, 'sslverify' => true, 'sslcertificates' => '/var/www/html/wp2/wp-includes/certificates/ca-bundle.crt', 'stream' => false, 'filename' => NULL, 'limit_response_size' => NULL, )

根据你的问题,你可以通过他的安全令牌(最好)或电子邮件ID

所以验证用户时,他安装的插件,你需要在服务器上创建一个安全令牌并发送给你的插件,然后请求插件存储到WordPress的每一次调用服务器之后,WordPress的数据库(wp_option首选),您需要验证令牌是否有效否则拒绝请求。

你需要改变你的代码来验证有效的数据来对POST而不是一味地检查POST数据是可用的

您可以把令牌头 例:Authorization: Basic dm9yZGVsOnZvcmRlbA==