图片 3

PHP项目中CodeIgniter使用的一些建议,如何编写一个独立的

本文由码农网 –
邱康原创,转载请看清文末的转载要求,欢迎参与我们的付费投稿计划!

0×00 背景

PHP对象注入是一个非常常见的漏洞,这个类型的漏洞虽然有些难以利用,但仍旧非常危险,为了理解这个漏洞,请读者具备基础的php知识。

独立的 PHP 扩展可以独立于 PHP
源码之外进行分发。要创建一个这样的扩展,需要准备好两样东西:

最近再给一个APP写API,同时还要写相应的后台管理网站。为了便于开发和代码组织与管理,我决定采用一个现有的框架。Codeigniter由于其轻量容易自定制的特点吸引了我,一路开发过来也有大半年时间了,写下一些自己在开发过程中的一些体会来与大家共勉。

0×01 漏洞案例

如果你觉得这是个渣渣洞,那么请看一眼这个列表,一些被审计狗挖到过该漏洞的系统,你可以发现都是一些耳熟能详的玩意(就国外来说)

WordPress
3.6.1

Magento
1.9.0.1

Joomla 3.0.3

Ip board 3.3.5

除此之外等等一堆系统,八成可能大概在这些还有其他的php程序中还有很多这种类型的漏洞,所以不妨考虑坐下喝杯咖啡并且试着去理解这篇文章。

图片 1

  • 配置文件 (config.m4)
  • 你的模块源码

开发工具

开发工具有好多,每个人的习惯也不同。Eclipse一直是我的最爱,那么怎么让Eclipse支持codeigniter呢?

首先这是个PHP项目,所以得让Eclipse支持PHP。假设你的计算机已经安装了PHP,那么最简单的做法就是在Eclipse的market space中搜索PDT并安装。具体操作:Help -> Eclipse
Marketplace。在输入框中输入PDT,点击find,如图:

图片 2

点击右下方的install,等待几分钟即可。

现在可以在Eclipse中写PHP了,不过对于codeigniter来说,经常用到的语句类似如下:

$this->load->model ( 'user_model' );

$this->input->post ('phone');

每次都要手动输入这么长的类似的语句对于追求高效的人来说显然是不可取的,所以得让Eclipse支持codeigniter特定的代码提示,包括Controller和Model。把如下代码添加到

system/core/
目录下的Controller文件中CI_Controller类的构造函数之前,这其实就是进行

变量声明,Model文件也是同样操作。

 /**
       * @var CI_Config
       */

       var $config;

       /**
       * @var CI_DB_active_record
       */

       var $db;

       /**
       * @var CI_Email
       */

       var $email;

       /**
       * @var CI_Form_validation
       */

       var $form_validation;

       /**
       * @var CI_Input
       */

       var $input;

       /**
       * @var CI_Loader
       */

       var $load;

       /**
       * @var CI_Router
       */

       var $router;

       /**
       * @var CI_Session
       */

       var $session;

       /**
       * @var CI_Table
       */

       var $table;

       /**
       * @var CI_Unit_test
       */

       var $unit;

       /**
       * @var CI_URI
       */

       var $uri;

       /**
       * @var CI_Pagination
       */

       var $pagination;

现在效果如下:

图片 3

只需输入$this 即可产生代码提示,效率提高不少。

0×01 PHP类和对象

类和变量是非常容易理解的php概念,打个比方,下面的代码在一个类中定义了一个变量和一个方法。

<?php

class TestClass
{
    // A variable

    public $variable = 'This is a string';

    // A simple method

    public function PrintVariable()
    {
        echo $this->variable;
    }
}

// Create an object

$object = new TestClass();

// Call a method

$object->PrintVariable();

?>

它创建了一个对象并且调用了 PrintVariable 函数,该函数会输出变量
variable。

如果想了解更多关于php面向对象编程的知识 请点:

接下来我们来描述一下如果创建这些文件并组合起来。

自定义辅助函数和库

一般一个项目中会有许多相同的逻辑,会使用到相同的代码。如果每次都去复制粘贴不仅麻烦而且不利于后续修改,想到需要修改一个逻辑就要到每个文件里修改代码就觉得可怕(涉及到设计模式这一块了,值得我们学学)。所以你要善于利用那些自定义辅助函数(helpers)和自定义的库(libraries)。把相同的逻辑封装成函数或者类,每次遇到相同的逻辑之时只需调用现成的helper或者library即可,修改也只需要在helper或者library中一处修改,不需要到处找代码。

举一个我项目中的例子。API需要给APP发送的请求返回json格式数据,那么在PHP中的一种实现方法就是:

echo json_encode ( $data);//$data 是array类型的数据

但是如果$data中包含中文字符的话,输出的json数据会把中文变成Unicode编码,为了避免客户端需要再次处理数据,需要加入一个参数,即:

echo json_encode ( $data , JSON_UNESCAPED_UNICODE);//$data 是array类型的数据

这样就能输出原始的中文了。但是问题又来了,每次都要写这么长一段代码实在是麻烦,所以封装成一个辅助函数。在application/helpers
文件夹中新建一个文件render_helper.php。其中代码如下:

<?php

defined ( 'BASEPATH' ) or exit ( 'No direct script access allowed' );

/**

 * 打印不转义中文的json

 * @param [array] $data

 */

function echo_json($data) {

       echo json_encode ( $data, JSON_UNESCAPED_UNICODE );

}

那么每次调用之时只需先在类中的构造函数载入该辅助函数,如下:

$this->load->helper ( 'render' ); // 载入打印json的自定义辅助函数

就可以在本类的所有成员函数中使用该方法:

echo_json ( $data);

这样省时省力(加上Eclipse的代码提示,你只需要输入echo,这个函数就可以出来了)。以后需要修改成编码后中文,或者转换成英文等等(奇怪的需求~)你都可以只修改一行代码,效率提高不少。

0×02 php Magic方法

php类可能会包含一些特殊的函数叫magic函数,magic函数命名是以符号“__”开头的,比如
__construct, __destruct, __toString, __sleep, __wakeup
和其他的一些玩意。

这些函数在某些情况下会自动调用,比如:

__construct 当一个对象创建时调用 (constructor) __destruct
当一个对象被销毁时调用 (destructor) __
toString当一个对象被当作一个字符串使用

为了更好的理解magic方法是如何工作的,让我们添加一个magic方法在我们的类中。

<?php
    class TestClass
    {
    // 一个变量public $variable = 'This is a string';// 一个简单的方法

    public function PrintVariable()
    {
    echo $this->variable . '<br />';
    }

    // Constructor

    public function __construct()
    {
    echo '__construct <br />';
    }

    // Destructor

    public function __destruct()
    {
    echo '__destruct <br />';
    }

    // Call

    public function __toString()
    {
    return '__toString<br />';
    }
    }

    // 创建一个对象
    // __construct会被调用

    $object = new TestClass();

    // 创建一个方法
    // 'This is a string’ 这玩意会被输出

    $object->PrintVariable();

    // 对象被当作一个字符串
    // __toString 会被调用

    echo $object;

    // End of PHP script
    // php脚本要结束了, __destruct会被调用

    ?>

我们往里头放了三个 magic方法,__construct, __destruct和
__toString,你可以看出来,__construct在对象创建时调用,
__destruct在php脚本结束时调用,__toString在对象被当作一个字符串使用时调用。

这个脚本会输出这狗样:

__construct 
This is a string 
__toString 
__destruct

这只是一个简单的例子,如果你想了解更多有关magic函数的例子,请点击链接

准备好系统工具

想要扩展能够在系统上编译并成功运行,需要准备转以下工具:

  • GNU autoconf
  • GNU automake
  • GNU libtool
  • GNU m4

以上这些都可以从 获取。

注:以上这些都是类 Unix 环境下才能使用的工具。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

标签:, , , , , , , , , , ,
网站地图xml地图