PHP的相关内容分享
discuz获取真实ip的方法是这个:
source/class/discuz/discuz_application.php

private function _get_client_ip() {
  $ip = $_SERVER['REMOTE_ADDR'];
  if (isset($_SERVER['HTTP_CLIENT_IP']) && preg_match('/^([0-9]{1,3}\.){3}[0-9]{1,3}$/', $_SERVER['HTTP_CLIENT_IP'])) {
    $ip = $_SERVER['HTTP_CLIENT_IP'];
  } elseif(isset($_SERVER['HTTP_X_FORWARDED_FOR']) AND preg_match_all('#\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}#s', $_SERVER['HTTP_X_FORWARDED_FOR'], $matches)) {
    foreach ($matches[0] AS $xip) {
      if (!preg_match('#^(10|172\.16|192\.168)\.#', $xip)) {
        $ip = $xip;
        break;
      }
    }
  }
  return $ip;
}


也就是说默认用REMOTE_ADDR,如果有HTTP_CLIENT_IP或HTTP_X_FORWARDED_FOR,则用相应的指定的IP地址。
这个对于用ip来限制重试密码的方式来说,很危险,伪造一个CLIENT_IP或者X_FORWARDED_FOR就可以让discuz认为的独立的ip,从而脱离限制。
discuz也没有白名单机制去限制这两个参数的使用,所以是个很危险的漏洞。

防御方式:对使用CLIENT_IP或者X_FORWARDED_FOR限制

如果明确不使用代理方式部署服务器,那可以考虑禁用这两个参数。
如果用代理的方式部署,可以实施白名单机制。
PHP修改代码即可,判别REMOTE_ADDR白名单再启用这两个参数。

Nginx也可以有白名单的方式,编译需要添加参数:
--with-http_realip_module
使用说明:http://nginx.org/en/docs/h...

可以对比一下几个方式搭配:
1 不使用realip_module
2 使用realip_module

客户端模式:
A 伪造client-ip直接访问目标服务器
B 伪造client-ip访问代理服务器
C 代理服务器不在realip_module白名单
代理服务器设置
proxy_set_header        CLIENT-IP       $remote_addr;


为此,我们需要先修改PHP代码,以便获知PHP获得的参数:

private function _get_client_ip() {
  $ip = $_SERVER['REMOTE_ADDR'];
  if (isset($_GET['debug_ip'])) {
    exit('REMOTE_ADDR:'.$ip.' / CLIENT_IP:'.$_SERVER['HTTP_CLIENT_IP'].' / X_FORWARDED_FOR:'.$_SERVER['HTTP_X_FORWARDED_FOR']."\n");
  }
  $white_lists = array(
    '60.191.x.y',
    '123.157.x.y',
    '222.187.x.y',
    '121.40.x.y',
    );
  if (!in_array( $ip, $white_lists)) {
    return $ip;
  }
  if (isset($_SERVER['HTTP_CLIENT_IP']) && preg_match('/^([0-9]{1,3}\.){3}[0-9]{1,3}$/', $_SERVER['HTTP_CLIENT_IP'])) {
    $ip = $_SERVER['HTTP_CLIENT_IP'];
  } elseif(isset($_SERVER['HTTP_X_FORWARDED_FOR']) AND preg_match_all('#\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}#s', $_SERVER['HTTP_X_FORWARDED_FOR'], $matches)) {
    foreach ($matches[0] AS $xip) {
      if (!preg_match('#^(10|172\.16|192\.168)\.#', $xip)) {
        $ip = $xip;
        break;
      }
    }
  }
  return $ip;
}


测试组合结果:
域名和ip因为隐私做了替换
引用
1A

curl -H "host:www.aslibra.com" -H "CLIENT-IP:2.3.4.5" "dyw3.aslibra.com/?debug_ip=1"
REMOTE_ADDR:114.243.204.152 / CLIENT_IP:2.3.4.5 / X_FORWARDED_FOR:

1B

curl -H "host:www.aslibra.com" -H "CLIENT-IP:2.3.4.5" "dyw4.aslibra.com/?debug_ip=1"
REMOTE_ADDR:222.187.x.y / CLIENT_IP:114.243.204.152 / X_FORWARDED_FOR:

2A

curl -H "host:www.aslibra.com" -H "CLIENT-IP:2.3.4.5" "dyw3.aslibra.com/?debug_ip=1"
REMOTE_ADDR:114.243.204.152 / CLIENT_IP:2.3.4.5 / X_FORWARDED_FOR:

2B

curl -H "host:www.aslibra.com" -H "CLIENT-IP:2.3.4.5" "dyw4.aslibra.com/?debug_ip=1"
REMOTE_ADDR:114.243.204.152 / CLIENT_IP:114.243.204.152 / X_FORWARDED_FOR:

2C 222.187.x.y 不在nginx的白名单的情况

curl -H "host:www.aslibra.com" -H "CLIENT-IP:2.3.4.5" "dyw4.aslibra.com/?debug_ip=1"
REMOTE_ADDR:222.187.x.y / CLIENT_IP:114.243.204.152 / X_FORWARDED_FOR:


测试结果说明什么问题?
1A 客户端ip 和设定的ip都收到
1B 代理ip和客户端ip
2A 客户端ip和设定的ip
2B 客户端ip和客户端ip
2C 代理ip和客户端ip

说明,realip_module传递给PHP后端REMOTE_ADDR就是合法的CLIENT_IP,而CLIENT_IP却没有清空
那问题来了,它没法解决discuz检查CLIENT_IP的漏洞,如果检查就没戏
所以,PHP加一份白名单很有必要哦!
SimpleXMLElement Object的数据有点怪异
里面的array用循环居然读不出来的
有个方式可以:

/**
* function object2array - A simpler way to transform the result into an array
*   (requires json module).
*
* This function is part of the PHP manual.
*
* The PHP manual text and comments are covered by the Creative Commons
* Attribution 3.0 License, copyright (c) the PHP Documentation Group
*
* @author  Diego Araos, diego at klapmedia dot com
* @date    2011-02-05 04:57 UTC
* @link    http://www.php.net/manual/en/function.simplexml-load-string.php#102277
* @license http://www.php.net/license/index.php#doc-lic
* @license http://creativecommons.org/licenses/by/3.0/
* @license CC-BY-3.0 <http://spdx.org/licenses/CC-BY-3.0>
*/
function object2array($object)
{
    return json_decode(json_encode($object), TRUE);
}


据闻xml也可以:
function xmlstring2array($string)
{
    $xml   = simplexml_load_string($string, 'SimpleXMLElement', LIBXML_NOCDATA);

    $array = json_decode(json_encode((array)$xml), TRUE);

    return $array;
}


摘自:http://stackoverflow.com/questions/6167279/converting-a-simplexml-object-to-an-array
在MAC系统下进行PHP开发,最简单的方法是到http://www.apachefriends.org/en/xampp-macosx.html下载个文件,装上就可直接进行开发了,好处很明显,简单易用。

    使用MacPorts配置PHP开发环境(PHP54+PHP FPM+NGINX+MYSQL55),首先需要安装port,访问:http://www.macports.org/install.php,直接下载源代码: https://distfiles.macports.org/MacPorts/MacPorts-2.1.3.tar.gz。

    安装port:

    1. tar xzvf MacPorts-2.1.3.tar.gz  解压

    2. cd MacPorts-2.1.3

    3. ./configure && make && sudo make install

    这样就安装好port了。

    4. vi ~/.bash_profile

    按i键进入编辑方式,粘下以下文字:

    export PATH=/opt/local/bin:$PATH

    按ESC键退出编辑方式,按:键再输入wq保存退出。

    现在我们就可以很方便地使用port了。

    安装php:

    1. port info php 列出所支持的php信息,可以根据需要来选对应的版本安装,我选php54这个版本。

    2. sudo port install php54 php54-fpm php54-mysql php54-mbstring php54-mcrypt php54-sockets php54-curl 可以根据需要增加或者减少

    3. cd /opt/local/etc/php54/

    4. sudo cp ./php-fpm.conf.default ./php-fpm.conf

    5. sudo cp ./php.ini-development ./php.ini 可以根据需要换成php.ini-production的

    6. vi ~/.bash_profile 加上以下内容:

#php-fpm
alias fpm_start='sudo launchctl load -w /Library/LaunchDaemons/org.macports.php54-fpm.plist'
alias fpm_stop='sudo launchctl unload -w /Library/LaunchDaemons/org.macports.php54-fpm.plist'
alias fpm_restart='fpm_stop; fpm_start'

    7. 打开个新的命令窗口,输入:fpm_start,php-fpm就开始运行了,可以用top命令查看或者用ps -e | grep php-fpm查看。

    这样子php就已经搞定了。

    nginx:

    1. sudo port install nginx

    2. vi ~/.bash_profile 加上以下内容:

# nginx
alias nginx_start='sudo launchctl load -w /Library/LaunchDaemons/org.macports.nginx.plist'
alias nginx_stop='sudo launchctl unload -w /Library/LaunchDaemons/org.macports.nginx.plist'
alias nginx_restart='nginx_stop; nginx_start;'

    3. cd /opt/local/etc/nginx/

    4. sudo cp fastcgi.conf.example fastcgi.conf 如此类推,把那些以.example为后缀的拷出一份没有.example为后缀的文件来。

    5. sudo vi nginx.conf 找到

# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 这段,内容改成这样子:

# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
location ~ \.php$ {
root share/nginx/html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /opt/local/share/nginx/html$fastcgi_script_name;
include fastcgi_params;
}

其实就是去掉前面的#号和改了一下fastcgi_param SCRIPT_FILENAME /opt/local/share/nginx/html$fastcgi_script_name;

    6. nginx_start就可以启动了

    7. cd /opt/local/share/nginx/html/

    8. vi phpinfo.php 加入以下内容:



    9. 通过浏览器访问:http://localhost/phpinfo.php 完成。

    MYSQL:

    1. sudo port install mysql55 再根据安装完成后的内容设置数据库

    2. vi ~/.bash_profile 加上以下内容:

#mysql
alias mysql_start='sudo launchctl load -w /Library/LaunchDaemons/org.macports.mysql55-server.plist'
alias mysql_stop='sudo launchctl unload -w /Library/LaunchDaemons/org.macports.mysql55-server.plist'
alias mysql_restart='mysql_stop; mysql_start'

    3. mysql_start

    4. sudo vi /opt/local/ect/mysql55/my.cnf 注掉# !include /opt/local/etc/mysql55/macports-default.cnf 这一行,再加上: [mysqld_safe] socket = /tmp/mysql.sock, 否则mysql命令可以连接,工具连不上。


from: http://www.cnblogs.com/afxcn/archive/2013/06/02/3113934.html
发现php里获取https内容有问题,所以查了很多资料,发现确实有这个问题,也同时对比了一下,想尝试解决这个问题。

phpinfo里打印的curl的信息:
libcurl/7.19.7 NSS/3.15.3 zlib/1.2.3 libidn/1.18 libssh2/1.4.2

以前正常的服务器的curl信息:
libcurl/7.15.5 OpenSSL/0.9.8b zlib/1.2.3 libidn/0.6.5

测试过同样的代码,http请求没有问题,https请求,网页直接返回502错误
后面一个文章提示 fastcgi_param的问题,测试过没有效果。

怀疑是curl和openssl的问题,因为版本里是NSS,不是OpenSSL
这有一份对比 http://curl.haxx.se/docs/ssl-compared.html

想着试试重新安装curl和openssl
参考这个:linux php源码包 安装openssl 和curl 扩展  
http://yonghui702.blog.163.com/blog/static/81718342013111953738670/

安装过后,配置php.ini,重启php,也没有发现curl的信息发生改变
测试结果也没有正常

也有yum安装更新了curl和openssl,没感觉有效

strace跟踪一下php的进程,也不太会看,但不知道为啥,后面是正常了
看phpinfo的信息倒是没变

本文没有查到明确的解决方式,只是多尝试了几个方式,没有明确哪个产生了解决效果
所以,纯当参考吧

更多参考:
http://bbs.51cto.com/thread-1077956-1-1.html
http://stackoverflow.com/questions/17439199/php-fpm-crashed-when-curl-or-file-get-contents-request-a-https-url
https://bugs.php.net/bug.php?id=19301
https://bugs.php.net/bug.php?id=47616
yum的方式安装软件很方便,编译安装真的是太累了
一个新服务器要搞定所有东西,真是太麻烦
要不然就是安装apache,也很方便
php的很多功能都是模块化安装,比如连json的解析都需要额外安装

引用
今天安装赵容提供的监控源码,我在两台虚拟机上测试使用,环境是lamp,但php居然报PHP Fatal error: Call to undefined function json_encode()错误,网上找了下说是要安装json模块.
  系统:centos 5.5
1.安装前准备
yum -y install php-devel php-pear gcc make

2.安装json
pear install pecl/json
或者
pecl install json

3.让php支持json
我的php是yum安装的,所以
cd /etc/php.d
echo "extension=json.so" > json.ini
重启apache
service httpd restart

如果有selinux,执行下面命令
chcon system_u:object_r:textrel_shlib_t /usr/lib/php/modules/json.so

chcon -c -v -R -u system_u -r object_r -t textrel_shlib_t /usr/lib/php/modules/json.so

4.验证
php -m|grep json
json
可以看到php已经支持json了,现在可以重新去执行了php页面了.
分页: 1/19 第一页 1 2 3 4 5 6 7 8 9 10 下页 最后页 [ 显示模式: 摘要 | 列表 ]

阅读推荐

服务器相关推荐

开发相关推荐

应用软件推荐