6

我有一个简单的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);
}

这里的问题,它显示的是普通密码,如果我输入123456controller ,我会得到123456.

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

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

4

5 回答 5

13

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

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

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

特别是Nigel 帖子中的 force 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)。

于 2012-08-28T12:54:18.117 回答
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 的答案提供了更多详细信息并且是正确的,请同时查看/代替

于 2012-08-28T11:50:49.270 回答
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);

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

于 2012-08-28T11:20:50.783 回答
1
$password = sha1($this->input->post('password'));

or 

$hash= $this->input->post('password');

$password= $this->encrypt->sha1($hash);

您可以使用md5代替sha1,但sha1md5安全……而且md5 和 sha1 都是不可解码的

于 2013-04-26T08:28:44.477 回答
0

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

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

$protocol = ( isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on' ) ? 'https' : 'http';
$config['base_url'] = $protocol.'://www.yoursite.com';
于 2014-09-23T07:19:18.463 回答