<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,以便从数据库中获取数据。任何帮助将不胜感激
答案 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"
但网址会变得相当长。