为安全性和代码管理目的而采用更好的方法

时间:2013-07-09 18:03:02

标签: cakephp cakephp-2.3

我正在一个非常大的项目上开发Cakephp 2.3,我即将在全球范围内推出我的网站。

我的应用程序上有一个登录系统。我正在分享我的代码,因为我想确定我是否正确编码...以及任何缺少任何函数的检查,或者是否有任何建议添加内容或删除代码中的内容将非常感激。并且还在安全方面发表评论...... 请告诉我一些使我的网站更快的提示..例如如何编写更快的查询或从这个blabla删除不需要的

class UsersController extends AppController
{

    public $components = array('Cookie');

    public function beforeFilter()
    {
        parent::beforeFilter();
        App::uses('Utility', 'Utility');
        $this->Auth->allow('index');
        $this->Security->requireSecure('login'); // for security

        $this->Auth->authenticate = array(
            'Authenticate.Cookie' => array(
               'fields' => array(
                    'username' => 'email',
                    'password' => 'password'
               ),
                'userModel' => 'User',
                'scope' => array(
                   'User.active' => 1
                )
            ),
            'Authenticate.MultiColumn' => array(
                'fields' => array(
                    'username' => 'email',
                    'password' => 'password'
                ),
                'columns' => array(
                    'email',
                    'mobileNo'
                ),
                'userModel' => 'User'
            )
        );
    }



public function index()
{
    $this->layout = 'logindefault';

    if (!$this->Auth->login() || !$this->Auth->loggedIn()) {

        $this->redirect(array(
            'controller' => 'users',
            'action' => 'login'
        ));

    } else {
        $this->redirect(array(
            'controller' => 'users',
            'action' => 'dashboard'
        ));
    }

}


public function login()
{

    $this->layout = 'logindefault';
    $this->set('title_for_layout', 'Account Login');




    if ($this->Auth->login() || $this->Auth->loggedIn()) {


        $lastLogin = $this->Auth->User('lastLogin');

        if ($lastLogin != null) {
            $this->redirect($this->Auth->redirect());
        } else {
            $this->redirect(array(
                'controller' => 'Userinfo',
                'action' => 'gettingstarted'
            ));

        }

    } else {

        if ($this->request->is('post')) {

            $mobileNo = $this->request->data['User']['email'];

            $mobileNo = Utility::addPlusToMobileNo($mobileNo);

            $this->request->data['User']['email'] = $mobileNo;




            if ($this->Auth->login() || $this->Auth->loggedIn()) {
                if ($this->Session->check('Auth.User')) {

                    $this->_setCookie($this->Auth->user('idUser'));

                    $lastLogin = $this->Auth->User('lastLogin');
                    if ($lastLogin != null) {
                        $this->redirect(array(
                            'controller' => 'users',
                            'action' => 'dashboard'
                        ));
                    } else {

                        $this->redirect(array(
                            'controller' => 'Userinfo',
                            'action' => 'gettingstarted'
                        ));

                    }
                }
            } else {
                $this->Session->setFlash('Incorrect Email/Password Combination'); 
            }
        }
    }
}



protected function _setCookie($id)
{
    if (!$this->request->data('User.remember_me')) {
        return false;
    }
    $data = array(
        'username' => $this->request->data('User.email'),
        'password' => $this->request->data('User.password')
    );
    $this->Cookie->write('User', $data, true, '1 week');
    return true;
}


public function logout()
{
    $this->Cookie->delete('User');
    $this->redirect($this->Auth->logout());
}

1 个答案:

答案 0 :(得分:0)

  • 如果您希望保护您的应用在任何地方都使用它,您似乎已经在使用SecurityComponent了。对于AJAX表单,白名单只列出您需要的字段,不要禁用该组件!
  • Put App :: uses('Utility','Utility');在文件顶部
  • $ mobileNo = Utility :: addPlusToMobileNo($ mobileNo);应该在模型beforeSave()
  • 中发生
  • 如果这应该在全世界使用我假设你想要翻译,这就缺少翻译方法调用__()setFlash('不正确的电子邮件/密码组合');
  • 大部分代码都应该进入模型层
  • 有单元测试吗?如果没有添加单元测试,专门测试数据验证和虚假数据输入。您希望单元测试的代码覆盖率达到85%以上。
  • 您没有遵循CakePHP编码标准

如果没有能够访问整个应用程序代码并进行代码审查(我可以这样做),就没有办法告诉你更多。对于查询,始终只查询所需的数据,检查生成的SQL查询,使用DebugKit检查查询时间以查找慢速查询和缓慢呈现页面。