【问题标题】:Encrypted parameter in URL using CodeIgniter使用 CodeIgniter 在 URL 中加密参数
【发布时间】:2015-01-29 02:49:25
【问题描述】:

您好,我正在使用 CodeIgniter 制作应用程序。

我想将数字 id 加密为加密字符串。

来自

http://example.com/post/6

http://example.com/post/v4th54u654khi3f23of23ir2h398eh2xi012

我尝试了内置的加密库

$this->加密->编码(6)

但它会为每个页面加载生成不同的加密字符串,这不是我想要的,我想要永久链接,就像 Youtube 视频 ID。

我需要加密的字符串也可以解密。

【问题讨论】:

  • 加密级别重要吗,还是只是为了美观?试试base 64吧
  • 出于安全原因我想加密 id

标签: php codeigniter url encryption codeigniter-2


【解决方案1】:

你是否在配置文件中设置了$config['encryption_key'] = "Test@123";

你必须在字符串之后传递密钥

$this->encrypt->encode(6, 'Test@123')

$this->encrypt->decode(6, 'Test@123')

我已经为此扩展了核心库

创建一个文件名 MY_Encrypt.php 并将此文件放入 application\libraries

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

class MY_Encrypt extends CI_Encrypt
{

  function encode($string, $key = "", $url_safe = TRUE) {
      $ret = parent::encode($string, $key);

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

      return $ret;
  }

  function decode($string, $key = "") {
      $string = strtr($string, array('.' => '+', '-' => '=', '~' => '/'));

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

}  

?>

现在你可以使用

$this-&gt;encrypt-&gt;encode(6)

$this-&gt;encrypt-&gt;decode(6)

这将有相同的结果。

【讨论】:

  • 它将生成 url 安全字符串,这是一个很好的观点,但(我认为)问题是关于永久链接意味着每次加密 6 时 6 的编码字符串都应该相同。这样一来用户可以将其用作永久链接或绝对链接
  • 是的,它是一样的,只有在你传递不同的密钥进行编码和解码时才会改变
  • @RanaSoyab,我试过你的代码,但我收到错误 undefined property: user_control::$encrypt
  • 我应该在配置文件中添加文件名吗?
【解决方案2】:

Codeigniter 为此提供了一个库,你可以在 autoload.php 文件中添加 您可以使用下面的行进行编码和解码。 可能你会为 ex 编码相同的值。 "$a" 多次然后编码值 $encodedA 不同,但是当你去解码时,你总是会得到 $decodedA=123。 $a = '123';$encodedA = $this->encrypt->encode($a);$decodedA = $this->encrypt->decode($encodedA);

【讨论】:

    【解决方案3】:

    摆脱这种情况的最简单方法是:

    编码:$url_val=base64_encode($this-&gt;encryption-&gt;encrypt($var_to_encode));

    解码:$var_to_encode=$this-&gt;encryption-&gt;decrypt(base64_decode($url_val));

    测试功能

    function test() {
        for($i=7000;$i<8000;$i++){
            $x=urlencode($this->encryption->encrypt($i));
            $y=$this->encryption->decrypt(urldecode($x));
            if ($y == $i) { //$y != $i cross test
                echo "$y&ltbr&gt;$x&ltbr&gt;&ltbr&gt;";
            }
        }
    }
    

    考虑到 config/config.php 已经设置好了:

    $config['encryption_key'] ="key_here"
    

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

    【讨论】:

      【解决方案4】:

      对于那些由于 mycrpt 而无法在 php 7 上运行的库 -> 新图书馆:https://www.codeigniter.com/user_guide/libraries/encryption.html

      【讨论】:

      • 不是需要解释的 anwser .....这只是新的库......对于我这样的每个人来说,这里的 anwsers 不适用于 php 7 .. 2 之后几个小时的搜索怎么能完成我发现这是一个codeigniter更新并且有一个新的库......真的需要-1来帮助那些拥有php7的人吗?那么谢谢你;)
      【解决方案5】:

      用于生成加密 id 就像 Youtube 手表 id 我用 CodeIgniter 的哈希值 Spark

      https://github.com/sekati/codeigniter-hashids

      此帮助程序的目的是实现 Hashids 以从数字生成哈希(如 YouTube 或 Bitly)以混淆数据库 ID。

      安装就像我在第 20 行修改 hashids_helper.php 的指令一样

      require_once FCPATH . 'sparks/sk-hashids/' . HASHIDS_VERSION . '/vendor/Hashids.php';
      

      require_once FCPATH . 'vendor/Hashids.php';  //according to your Hashids path
      

      【讨论】:

        【解决方案6】:

        您可以将 id 转换为 SHA1,而不是尝试使用编码和解码。 sha1 将生成字母数字键,因此您也不会收到 url 支持错误。无需编码解码。这将生成一个安全的加密代码。

        $random_key = sha1($leadDetails->lead_number);
        

        【讨论】:

          猜你喜欢
          • 2017-02-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-07-05
          • 1970-01-01
          • 1970-01-01
          • 2015-12-21
          • 1970-01-01
          相关资源
          最近更新 更多