Skip to main content

阿里云服务器安装wordpress

网上有很多介绍如何安装wordpress的,但是几乎没有一个从头到尾能成功的。最近在搭建一个,就把步骤一个个都记录下来,方便大家参考。

1.安装mysql数据库
#yum -y install mysql-community-server

a

详细内容可以参照博客:
https://www.jb51.net/article/76493.htm

2.安装PHP

b

详细的安装可以参考博客:
https://my.oschina.net/u/3447660/blog/1786974

3.配置php-fpm

之前的apache httpd(<2.4),一般就通过编译好的libphp5.so 来动态解析php网页。apache 2.4之后,可以通过配置php-fpm来解析php页面。简单迅速。 然后去掉mod_proxy.so和mod_proxy_fcgi.so之前的注解,确保他们被apache加载。 如果php-fpm使用的是TCP socket,那么在httpd.conf末尾加上:
SetHandler “proxy:fcgi://127.0.0.1:9000”

如果用的是unix socket,那么httpd.conf末尾加上:


ProxySet disablereuse=off


SetHandler proxy:fcgi://php-fpm

重启apache和php-fpm服务:
systemctl restart httpd.service
systemctl restart php-fpm.service

4.下载wordpress
从官方地址下载最新的wordpress包
https://wordpress.org/download/

详细的配置可以参考官方向导:
https://codex.wordpress.org/zh-cn:%E5%AE%89%E8%A3%85_WordPress

如果一路没什么错误,就可以看见下边的页面,那就恭喜你安装成功了!

c

wordpress wp-includes/http.php漏洞修复

在wp-includes/http.php中有一处检验规则漏洞,文件中的wp_http_validate_url函数对输入IP验证不当,导致黑客可构造类似于012.10.10.10这样的畸形IP绕过验证,进行SSRF。

源代码的第534行中,调用了preg_match方法对传入的IP地址进行校验,这里可以构造一个畸形的IP地址,以跳过if去执行else,从而使用了gethostbyname。

核心问题出在此正则表达式的校验比较弱,正确的IPv4地址是xxx.xxx.xxx.xxx,但是首位不能是0。

 

解决办法-:增强正则表达式。

^(?:(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?))$

function wp_http_validate_url( $url ) {
 509      $original_url = $url;
 510      $url = wp_kses_bad_protocol( $url, array( 'http', 'https' ) );
 511      if ( ! $url || strtolower( $url ) !== strtolower( $original_url ) )
 512          return false;
 513  
 514      $parsed_url = @parse_url( $url );
 515      if ( ! $parsed_url || empty( $parsed_url['host'] ) )
 516          return false;
 517  
 518      if ( isset( $parsed_url['user'] ) || isset( $parsed_url['pass'] ) )
 519          return false;
 520  
 521      if ( false !== strpbrk( $parsed_url['host'], ':#?[]' ) )
 522          return false;
 523  
 524      $parsed_home = @parse_url( get_option( 'home' ) );
 525  
 526      if ( isset( $parsed_home['host'] ) ) {
 527          $same_host = ( strtolower( $parsed_home['host'] ) === strtolower( $parsed_url['host'] ) || 'localhost' === strtolower( $parsed_url['host'] ) );
 528      } else {
 529          $same_host = false;
 530      }
 531  
 532      if ( ! $same_host ) {
 533          $host = trim( $parsed_url['host'], '.' );
 534          if ( preg_match( '#^(([1-9]?\d|1\d\d|25[0-5]|2[0-4]\d)\.){3}([1-9]?\d|1\d\d|25[0-5]|2[0-4]\d)$#', $host ) ) {
 535              $ip = $host;
 536          } else {
 537              $ip = gethostbyname( $host );
 538              if ( $ip === $host ) // Error condition for gethostbyname()
 539                  $ip = false;
 540          }
 541          if ( $ip ) {
 542              $parts = array_map( 'intval', explode( '.', $ip ) );
 543              if ( 127 === $parts[0] || 10 === $parts[0] || 0 === $parts[0]
 544                  || ( 172 === $parts[0] && 16 <= $parts[1] && 31 >= $parts[1] )
 545                  || ( 192 === $parts[0] && 168 === $parts[1] )
 546              ) {
 547                  // If host appears local, reject unless specifically allowed.
 548                  /**
 549                   * Check if HTTP request is external or not.
 550                   *
 551                   * Allows to change and allow external requests for the HTTP request.
 552                   *
 553                   * @since 3.6.0
 554                   *
 555                   * @param bool   false Whether HTTP request is external or not.
 556                   * @param string $host IP of the requested host.
 557                   * @param string $url  URL of the requested host.
 558                   */
 559                  if ( ! apply_filters( 'http_request_host_is_external', false, $host, $url ) )
 560                      return false;
 561              }
 562          }
 563      }
 564  
 565      if ( empty( $parsed_url['port'] ) )
 566          return $url;
 567  
 568      $port = $parsed_url['port'];
 569      if ( 80 === $port || 443 === $port || 8080 === $port )
 570          return $url;
 571  
 572      if ( $parsed_home && $same_host && isset( $parsed_home['port'] ) && $parsed_home['port'] === $port )
 573          return $url;
 574  
 575      return false;
 576  }

[Bug] wordpress WPImageEditorImagick 指令注入漏洞

在/wp-includes/media.php的_wp_image_editor_choose函数内部找到:

[php]
$implementations = apply_filters( ‘wp_image_editors’, array( ‘WP_Image_Editor_Imagick’ ,  ‘WP_Image_Editor_GD’ ) );
[/php]

修改为:
[php]
$implementations = apply_filters( ‘wp_image_editors’, array(  ‘WP_Image_Editor_GD’ ,’WP_Image_Editor_Imagick’ ) );
[/php]

wordpress 中文标题/标签 404

搭建WordPress,版本4.3, 发现点击中文标题和中文标签的固定连接都会报页面找不到的错误,google/baidu了很久,大部分的解决方法都是改下边的代码:

打开wp-include中的classes.php文件

[php]
//$pathinfo = $_SERVER[‘PATH_INFO’];
$pathinfo = mb_convert_encoding($_SERVER[‘PATH_INFO’], "UTF-8", "GBK");

//$req_uri = $_SERVER[‘REQUEST_URI’];
$req_uri = mb_convert_encoding($_SERVER[‘REQUEST_URI’], "UTF-8", "GBK");
[/php]

但是经过测试,我发现并没有解决问题,于是从源代码入手,debug我发现我的文章(地址是:http://localhost/index.php/2016/03/14/%E6%B5%8B%E8%AF%95/),

PATH_INFO=”/2016/03/14/测试/”,但是REQUEST_URI=”/index.php/2016/03/14/%e6%b5%8b%e8%af%95/”,

说明编码是UTF8格式,但是REQUEST_URI并没有经过编码,而是进行了URL encode,通过下边的网址可以证明。

UrlEncode编码/解码

找到原因,就很好解决了。下边是需要改的代码:

classes.php文件

[php]
list ( $req_uri ) = explode ( ‘?’, urldecode ( $_SERVER [‘REQUEST_URI’] ) );
[/php]