zoukankan      html  css  js  c++  java
  • PHP温故知新(二)

    2、安装和配置

    安装这里要注意两点,是之前没有在意的:

    1、将php.ini文件中的 cgi.fix_pathinfo设置为0

        设置为0是为了解决一个安全漏洞,假如我们现在有这样一个URL:http://www.test.com/11.jpg 这样打开是一张图片,我们现在把URL改一下:http://www.test.com/11.jpg/a.php

       打开之后见下图:

       

    这些是图片文件的二进制内容,下面我们再新建一个PHP文件,里面代码为:

    <?php
    echo "我是漏洞!";

    命名为11.jpg ,虽然是图片格式,但是里面内容是PHP代码。之后我们再执行一次之前的URL:http://www.test.com/11.jpg/a.php 结果为:

    执行的是PHP代码。如果在某个论坛中,我们上传了一个图片格式,但内容是PHP代码的文件,之后我们运行这个文件,就可以链接数据库等任何操作,甚至可以删除数据。

    为什么会这样呢?

    如果开启 cgi.fix_pathinfo这个选项, 那么就会触发在PHP中的如下逻辑:

    /*
    * if the file doesn't exist, try to extract PATH_INFO out
    * of it by stat'ing back through the '/'
    * this fixes url's like /info.php/test
    */
    if (script_path_translated &&
         (script_path_translated_len = strlen(script_path_translated)) > 0 &&
         (script_path_translated[script_path_translated_len-1] == '/' ||
    ....//以下省略.

    PHP会认为SCRIPT_FILENAME是11.jpg, 而a.php是PATH_INFO, 然后PHP就把11.jpg当作一个PHP文件来解释执行。

    所以要把  cgi.fix_pathinfo 设置为0。请关闭fix_pathinfo(默认是开启的)。

    部分摘抄自:http://www.laruence.com/2010/05/20/1495.html

    2、php-fpm.conf 配置文件,确保 php-fpm 模块使用 www-data 用户和 www-data 用户组的身份运行

     这样做应该也是为了安全考虑,具体不详,希望大家告知。

    3、pecl 扩展库安装

    pecl是PHP扩展库,许多扩展可以通过

    pecl install extname

    安装,linux下安装完成之后在php.ini里加上

    extension=extname.so
    #以memcache为例
    extension=memcache.so

    另外还可以用dl()方法动态加载扩展

    <?php
    //
    PHP_SHLIB_SUFFIX 在win系统下为dll,在linux下为so
    if (!extension_loaded('sqlite')){
    $prefix = (PHP_SHLIB_SUFFIX === 'dll') ? 'php_' : ''; dl($prefix . 'sqlite.' . PHP_SHLIB_SUFFIX);
    }

    4、phpize编译

    有时候不能用 pecl 安装命令。这可能是因为在防火墙后面,或者是因为想要安装的扩展库还没有 PECL 兼容的包,例如 SVN 中尚未发布的扩展库。如果要编译这种扩展库,可以用更底层的编译工具来手工进行编译。

    phpize 命令是用来准备 PHP 扩展库的编译环境的。

    $ cd extname
    $ phpize
    $ ./configure
    $ make
    # make install
  • 相关阅读:
    程序员之痛:几千行代码能搞定的为什么要写几万行?
    python基础===新式类与经典类
    python基础===装饰器@property 的扩展
    java===java基础学习(16)---final
    java===java基础学习(15)---抽象,接口
    python基础===继承和多继承
    python基础===类的私有属性(伪私有)
    python基础===创建大量对象是节省内存方法
    java===java习题---Josephu问题
    java===java基础学习(14)---封装
  • 原文地址:https://www.cnblogs.com/scofi/p/5198026.html
Copyright © 2011-2022 走看看