codeigniter url加密不起作用

时间:2016-06-02 06:48:56

标签: php codeigniter encryption

<a href="<?php echo base_url().'daily_report/index/'.$this->encrypt->encode($this->session->userdata('employee_id')) ?>">

我使用codeigniter encrypt加密了上面的url 我在codeigniter配置文件中设置加密密钥

$config['encryption_key'] = 'gIoueTFDwGzbL2Bje9Bx5B0rlsD0gKDV';

我打电话给自动加载

$autoload['libraries'] = array('session','form_validation','encrypt','encryption','database');

当ulr(href)加载到url中时,它看起来像这样

http://localhost/hrms/daily_report/index/FVjGcz4qQztqAk0jaomJiAFBZ/vKVSBug1iGPQeKQCZ/K7+WUE4E/M9u1EjWh3uKTKeIhExjGKK1dJ2awL0+zQ==

但是url没有被解码,而且我没有得到employee_id它显示为空。

public function index($employee_id) {
        $save_employee_id = $employee_id;
        // decoding the encrypted employee id
        $get_employee_id = $this->encrypt->decode($save_employee_id);
        echo $employee_id; // answer: FVjGcz4qQztqAk0jaomJiAFBZ
        echo "<br>";
        echo $get_employee_id; // is display the null
        echo "<br>";

        exit();
        // get the employee daily report
        $data['get_ind_report'] =           $this->daily_report_model->get_ind_report($get_employee_id);
        // daily report page
        $data['header'] = "Daily Report";
        $data['sub_header'] = "All";
        $data['main_content'] = "daily_report/list";
        $this->load->view('employeelayout/main',$data);
    }

完整网址(3)

FVjGcz4qQztqAk0jaomJiAFBZ/vKVSBug1iGPQeKQCZ/K7+WUE4E/M9u1EjWh3uKTKeIhExjGKK1dJ2awL0+zQ==

仅显示

FVjGcz4qQztqAk0jaomJiAFBZ

我试图改变

$config['permitted_uri_chars'] = 'a-zA-Z 0-9~%.:_\-@=+';

允许的uri字符 但它抛出错误 因此,我需要使用codeigniter加密类加密url中的$ id,并在服务器端解密以获取实际的$ id,以便从数据库中获取数据。任何帮助将不胜感激

3 个答案:

答案 0 :(得分:2)

您必须扩展加密类并避免/使其正常工作。将此课程放在application/libraries文件夹中。并将其命名为MY_Encrypt.php

class MY_Encrypt extends CI_Encrypt
{
    /**
     * Encodes a string.
     * 
     * @param string $string The string to encrypt.
     * @param string $key[optional] The key to encrypt with.
     * @param bool $url_safe[optional] Specifies whether or not the
     *                returned string should be url-safe.
     * @return string
     */
    function encode($string, $key="", $url_safe=TRUE)
    {
        $ret = parent::encode($string, $key);

        if ($url_safe)
        {
            $ret = strtr(
                    $ret,
                    array(
                        '+' => '.',
                        '=' => '-',
                        '/' => '~'
                    )
                );
        }

        return $ret;
    }

    /**
     * Decodes the given string.
     * 
     * @access public
     * @param string $string The encrypted string to decrypt.
     * @param string $key[optional] The key to use for decryption.
     * @return string
     */
    function decode($string, $key="")
    {
        $string = strtr(
                $string,
                array(
                    '.' => '+',
                    '-' => '=',
                    '~' => '/'
                )
        );

        return parent::decode($string, $key);
    }
}

答案 1 :(得分:1)

FVjGcz4qQztqAk0jaomJiAFBZ/vKVSBug1iGPQeKQCZ/K7+WUE4E/M9u1EjWh3uKTKeIhExjGKK1dJ2awL0+zQ==

显示

FVjGcz4qQztqAk0jaomJiAFBZ

如果你仔细查看你的网址,你可以看到在显示的结果之后有一个'/'。现在任何字符串都将被视为另一个段。因此无法解码。 在这种情况下,加密库不起作用。

要么停止通过URL传递它,要么使用另一种不同的技术base_encode()。

希望有所帮助

答案 2 :(得分:0)

这是因为字符“/”是html uri分隔符的一部分。相反,您可以通过在将加密输出字符串附加到url之前对您的加密输出字符串进行rawurlen编码来避免html网址中的该字符来解决此问题。

\编辑:

我尝试过rawurlencode,但无法获得正确的输出。

最后成功使用此代码。 定义两个函数:

function hex2str( $hex ) {
  return pack('H*', $hex);
}

function str2hex( $str ) {
  return array_shift( unpack('H*', $str) );
}

然后使用call str2hex并将加密的用户ID传递给它,将加密的字符串转换为hexcode。 反转过程以获取正确的字符串,以便您可以解密它。

我能够正确编码和解码:

"FVjGcz4qQztqAk0jaomJiAFBZ/vKVSBug1iGPQeKQCZ/K7+WUE4E/M9u1EjWh3uKTKeIhExjGKK1dJ2awL0+zQ=="

为:

"46566a47637a3471517a7471416b306a616f6d4a694146425a2f764b56534275673169475051654b51435a2f4b372b57554534452f4d397531456a576833754b544b65496845786a474b4b31644a3261774c302b7a513d3d"

但网址会变得相当长。