Codeigniter Mcrypt扩展的临时解决方案

时间:2015-06-20 06:11:39

标签: php codeigniter pyrocms

我的项目中存在很大问题。我将项目开发成PYROCMS,并将PYROCMS开发成Codeigniter。但是,PYROCMS需要" Mcrypt扩展"。

我有服务器的ssh详细信息,但我没有权限在服务器上安装任何内容。

我需要" Mcrypt扩展"如何在没有安装或从任何地方下载的情况下工作,如果可能的话,将其上传到项目根目录中?。

我需要一个类似this的解决方案,如果没有安装 Mcrypt扩展,可以在laravel中使用这个打包到工作项目,请为 PYROCMS

今天是我今天需要上传的项目的最后一天无论发生什么,否则我会失去这个项目以及我的工作。请帮忙。

由于

5 个答案:

答案 0 :(得分:2)

您可以使用自己的库覆盖默认库。您可以尝试以下代码:

P.S。:我还没有测试过这段代码:)

创建文件:

  

/codeigniter/application/libraries/MY_Encrypt.php

以下代码开始使用:

<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class MY_Encrypt extends CI_Encrypt {

    public function __construct()
    {
        //parent::__construct();
    }

    /*
    Create your custom encryption and decryption logic by
    overriding function
    */

}

参考: https://ellislab.com/codeigniter/user-guide/general/creating_libraries.html

答案 1 :(得分:2)

  1. goto system / libraries / Encrypt.php
  2. 在构造函数中,注释回显页面
  3. 上的错误的行

    preview code context here..

答案 2 :(得分:1)

这是技巧,但可以与Pyrocms一起使用

基本上是焦炉,在以下模块中默认使用加密库

encryption

您的解决方案很少

  1. openssl库与encrypt一起使用,而不是mcrypt库(其扩展名是system/codeigniter/libraries ),在这些模块中替换它。

  2. 或下载https://raw.githubusercontent.com/bcit-ci/CodeIgniter/develop/system/libraries/Encryption.php并放置在MY_Encrypt.php中,并使用以下代码在system/cms/libraries中创建CI_Encrypt,以覆盖{ {1}}和encode我们只是调用新加密类的decodeencrypt

decrypt

3。或者,您可以创建自己的函数,然后直接加载

akshay@db-3325:/var/www/html/pyrocms/system/cms/libraries$ cat MY_Encrypt.php 
<?php
defined('BASEPATH') OR exit('No direct script access allowed');

require_once BASEPATH.'libraries/Encryption.php';

class MY_Encrypt extends CI_Encrypt {
    protected $instance;
    public function __construct(){
        $this->instance = new CI_Encryption();  
    }
    public function encode($data, $params = NULL){
        return call_user_func_array(array($this->instance, "encrypt"), func_get_args());
    }
    public function decode($data,  $params = NULL){
        return call_user_func_array(array($this->instance, "decrypt"), func_get_args());
    }
}

如下所示

akshay@db-3325:/var/www/html/pyrocms$ pwd
/var/www/html/pyrocms

# from index.php

require_once FCPATH.'compatibility.php';
require_once BASEPATH.'core/CodeIgniter'.EXT;
/* End of file index.php */

答案 3 :(得分:0)

打开,system / libraries / Encrpyte.php

转到第47行并更改

        $this->_mcrypt_exists =  TRUE;

转到第290行添加符号@

        $init_size = @mcrypt_get_iv_size($this->_get_cipher(), $this->_get_mode());

转到第299行并添加符号@

        return rtrim(@mcrypt_decrypt($this->_get_cipher(), $key, $data, $this->_get_mode(), $init_vect), "\0");

答案 4 :(得分:0)

请参阅此文件以获取帮助,我已从此处获取所有代码... encrypt.php 我用这个解决了这个问题。在CI-> system-> libraries-> encrypt.php文件中 代替

if (($this->_mcrypt_exists = function_exists('mcrypt_encrypt')) === FALSE)
{
    show_error('The Encrypt library requires the Mcrypt extension.');
}

我检查了mcrypt_encrypt函数。

$this->_mcrypt_exists = ( ! function_exists('mcrypt_encrypt')) ? FALSE : TRUE;

并基于如下所示的编码功能中使用的功能

function encode($string, $key = '')
{
    $key = $this->get_key($key);
    if ($this->_mcrypt_exists === TRUE)
    {
        $enc = $this->mcrypt_encode($string, $key);
    }
    else
    {
        $enc = $this->_xor_encode($string, $key);
    }
    return base64_encode($enc);
} 

这是_xor_encode函数

function _xor_encode($string, $key)
{
    $rand = '';
    while (strlen($rand) < 32)
    {
        $rand .= mt_rand(0, mt_getrandmax());
    }
    $rand = $this->hash($rand);
    $enc = '';
    for ($i = 0; $i < strlen($string); $i++)
    {
        $enc .= substr($rand, ($i % strlen($rand)), 1).(substr($rand, ($i % strlen($rand)), 1) ^ substr($string, $i, 1));
    }
    return $this->_xor_merge($enc, $key);
}

和_xor_merge函数

function _xor_merge($string, $key)
{
    $hash = $this->hash($key);
    $str = '';
    for ($i = 0; $i < strlen($string); $i++)
    {
        $str .= substr($string, $i, 1) ^ substr($hash, ($i % strlen($hash)), 1);
    }
    return $str;
}