【问题标题】:Codeigniter: How can I encrypt password before submitting the form to the controller?Codeigniter:如何在将表单提交给控制器之前加密密码?
【发布时间】:2012-08-22 21:14:15
【问题描述】:

我有一个简单的html 登录表单

<form method="post" action="http://www.example.com/login">
    <input type="text" name="text_box" />
    <input type="password" name="pass_word" />
    <input type="submit" name="submit">
</form>

当我提交表单并在控制器中

public function login(){
    $pass_word = $this->input->post('pass_word');
    die($pass_word);
}

这里的问题,它显示的是普通密码,如果我在控制器中输入123456,我会得到123456

  1. 这是一个安全问题吗?
  2. 任何人都可以通过wireshark等网络监控工具获取我的密码吗?

如何避免这种情况?在发送到控制器之前,我可以在视图中加密密码吗?

【问题讨论】:

  • 为此使用 javascript...你可以用谷歌搜索一个简单的 md5 加密脚本。只需在表单提交时对密码进行编码。
  • @vishal ,如果我加密了密码,你可以看到 js 并检查我用来加密的方法是什么,我认为你可以解密它
  • @KanishkaPanamaldeniya 我建议使用 MD5;这是一种单向散列算法,它会产生一个无法反转的散列(无论如何您都无法将散列恢复为原始字符串)MD5.
  • @Vishal:客户端处理不能解决问题。如果攻击者有中间人,他们可以在将 .js 提供给消费者时对其进行更改,并在不对其进行散列的情况下窃取输入。

标签: php security codeigniter encryption passwords


【解决方案1】:

通过http://codeigniter.com/user_guide/libraries/encryption.html 。此处描述了有关加密和解密的所有内容。

执行数据加密并将其作为字符串返回。示例:

$pass_word = $this->encrypt->encode(input->post('pass_word'));  

解密一个编码的字符串。示例:

$encrypted_pass_word = 'APANtByIGI1BpVXZTJgcsAG8GZl8pdwwa84';

$plaintext_pass_word = $this->encrypt->decode($encrypted_pass_word);

如果您不想在配置文件中使用第二个参数,您可以选择通过第二个参数传递您的加密密钥。通过链接阅读有关它的详细说明。

【讨论】:

  • 是的,我可以在控制器中进行加密,问题是有人可以在发布请求的中间获取密码?????
  • SSL 是唯一的答案。其他一切都可以通过查看您的 Javascript 来窥探或完成。 SSL 就是为此而设计的;如果你问这个问题,你绝对不应该想出更好的解决方案!
【解决方案2】:

是的,这绝对是一个安全问题。就像你说的,任何拥有 Wireshark(或类似工具)的人都有可能拦截它。

这可能不是您希望依赖 JavaScript 来实现的。通常你会使用 SSL/HTTPS 之类的东西,有一篇博客文章(有点旧)详细说明了如何使用 CodeIgniter 进行操作,但是它很常见,所以你可以通过一些谷歌搜索找到更新的教程。

http://sajjadhossain.com/2008/10/27/ssl-https-urls-and-codeigniter/ http://nigel.mcbryde.com.au/2009/03/working-with-ssl-in-codeigniter/。

更新: Lefter的回答提供了更多细节并且是正确的,请查看它/代替

【讨论】:

    【解决方案3】:

    如果您的帖子数据(密码等)被截获,那么它只会以纯文本形式显示。使用 SSL/HTTPS 将为您发送的数据提供加密。我不会依赖客户端 JavaScript 或任何类似的东西来验证/登录用户。看到正在使用安全连接,这也可能让您的用户更有信心。

    首先,我刚刚阅读了有关 SSL 和 HTTPS 的一般信息,以及 SSL 证书 - Wiki、Google 和 SO 都是不错的地方,那里有大量信息。

    对于在 CI 中使用 SSL/HTTPS,我发现这些很有用:

    特别是来自Nigel's post 的强制 ssl 功能:

    在 application/helper 中创建一个名为 ssl_helper.php 的文件

    if (!function_exists('force_ssl'))
    {
        function force_ssl()
        {
            $CI =& get_instance();
            $CI->config->config['base_url'] =
                     str_replace('http://', 'https://',
                     $CI->config->config['base_url']);
            if ($_SERVER['SERVER_PORT'] != 443)
            {
                redirect($CI->uri->uri_string());
            }
        }
    }
    
    function remove_ssl()
    {
        $CI =& get_instance();
        $CI->config->config['base_url'] =
                      str_replace('https://', 'http://',
                      $CI->config->config['base_url']);
        if ($_SERVER['SERVER_PORT'] != 80)
        {
            redirect($CI->uri->uri_string());
        }
    }
    

    加载帮助程序,然后在任何控制器的构造函数中 需要 ssl,只需插入:

    force_ssl();

    在您不想放置 ssl 的每个控制器中:

    if (function_exists('force_ssl')) remove_ssl();

    这是一种编程方法,另一种方法是使用 .htaccess(如果您使用的是 Apache)。

    【讨论】:

      【解决方案4】:
      $password = sha1($this->input->post('password'));
      
      or 
      
      $hash= $this->input->post('password');
      
      $password= $this->encrypt->sha1($hash);
      

      您可以使用 md5 代替 sha1sha1md5安全强>...和 md5 和 sha1 都是不可解码

      【讨论】:

        【解决方案5】:

        有一种更简单的方式来使用 https。

        我在 ./application/config/config.php 文件中添加了以下几行,它运行良好:

        $protocol = ( isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on' ) ? 'https' : 'http';
        $config['base_url'] = $protocol.'://www.yoursite.com';
        

        【讨论】:

        • 可能是非常简单的过程。
        猜你喜欢
        • 1970-01-01
        • 2020-11-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-03-08
        • 1970-01-01
        • 1970-01-01
        • 2016-05-26
        相关资源
        最近更新 更多